15a83710eSEric Fiselier //===----------------------------------------------------------------------===// 25a83710eSEric Fiselier // 357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 65a83710eSEric Fiselier // 75a83710eSEric Fiselier //===----------------------------------------------------------------------===// 85a83710eSEric Fiselier // 9*a7f9895cSLouis Dionne // UNSUPPORTED: no-threads 1031cbe0f2SLouis Dionne // UNSUPPORTED: c++03 115a83710eSEric Fiselier 125a83710eSEric Fiselier // <future> 135a83710eSEric Fiselier 145a83710eSEric Fiselier // class future<R> 155a83710eSEric Fiselier 165a83710eSEric Fiselier // void wait() const; 175a83710eSEric Fiselier 185a83710eSEric Fiselier #include <cassert> 19489637e6SNikolas Klauser #include <chrono> 20489637e6SNikolas Klauser #include <future> 215a83710eSEric Fiselier 2256462801SLouis Dionne #include "make_test_thread.h" 237fc6a556SMarshall Clow #include "test_macros.h" 247fc6a556SMarshall Clow func1(std::promise<int> p)255a83710eSEric Fiseliervoid func1(std::promise<int> p) 265a83710eSEric Fiselier { 275a83710eSEric Fiselier std::this_thread::sleep_for(std::chrono::milliseconds(500)); 285a83710eSEric Fiselier p.set_value(3); 295a83710eSEric Fiselier } 305a83710eSEric Fiselier 315a83710eSEric Fiselier int j = 0; 325a83710eSEric Fiselier func3(std::promise<int &> p)335a83710eSEric Fiseliervoid func3(std::promise<int&> p) 345a83710eSEric Fiselier { 355a83710eSEric Fiselier std::this_thread::sleep_for(std::chrono::milliseconds(500)); 365a83710eSEric Fiselier j = 5; 375a83710eSEric Fiselier p.set_value(j); 385a83710eSEric Fiselier } 395a83710eSEric Fiselier func5(std::promise<void> p)405a83710eSEric Fiseliervoid func5(std::promise<void> p) 415a83710eSEric Fiselier { 425a83710eSEric Fiselier std::this_thread::sleep_for(std::chrono::milliseconds(500)); 435a83710eSEric Fiselier p.set_value(); 445a83710eSEric Fiselier } 455a83710eSEric Fiselier 46b051cc93SLouis Dionne template <typename T, typename F> test(F func)47b051cc93SLouis Dionnevoid test(F func) { 485a83710eSEric Fiselier typedef std::chrono::high_resolution_clock Clock; 495a83710eSEric Fiselier typedef std::chrono::duration<double, std::milli> ms; 50b051cc93SLouis Dionne 515a83710eSEric Fiselier std::promise<T> p; 525a83710eSEric Fiselier std::future<T> f = p.get_future(); 5356462801SLouis Dionne support::make_test_thread(func, std::move(p)).detach(); 545a83710eSEric Fiselier assert(f.valid()); 555a83710eSEric Fiselier f.wait(); 565a83710eSEric Fiselier assert(f.valid()); 575a83710eSEric Fiselier Clock::time_point t0 = Clock::now(); 585a83710eSEric Fiselier f.wait(); 595a83710eSEric Fiselier Clock::time_point t1 = Clock::now(); 605a83710eSEric Fiselier assert(f.valid()); 615a83710eSEric Fiselier assert(t1-t0 < ms(5)); 625a83710eSEric Fiselier } 632df59c50SJF Bastien main(int,char **)64b051cc93SLouis Dionneint main(int, char**) 65b051cc93SLouis Dionne { 66b051cc93SLouis Dionne test<int>(func1); 67b051cc93SLouis Dionne test<int&>(func3); 68b051cc93SLouis Dionne test<void>(func5); 692df59c50SJF Bastien return 0; 705a83710eSEric Fiselier } 71