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 shared_future<R>
155a83710eSEric Fiselier 
165a83710eSEric Fiselier // template <class Rep, class Period>
175a83710eSEric Fiselier //   future_status
185a83710eSEric Fiselier //   wait_for(const chrono::duration<Rep, Period>& rel_time) const;
195a83710eSEric Fiselier 
205a83710eSEric Fiselier #include <cassert>
21489637e6SNikolas Klauser #include <chrono>
22489637e6SNikolas Klauser #include <future>
235a83710eSEric Fiselier 
2456462801SLouis Dionne #include "make_test_thread.h"
257fc6a556SMarshall Clow #include "test_macros.h"
267fc6a556SMarshall Clow 
275a83710eSEric Fiselier typedef std::chrono::milliseconds ms;
285a83710eSEric Fiselier 
291febe289SDavid Zarzycki static const ms sleepTime(500);
301febe289SDavid Zarzycki static const ms waitTime(5000);
311febe289SDavid Zarzycki 
func1(std::promise<int> p)325a83710eSEric Fiselier void func1(std::promise<int> p)
335a83710eSEric Fiselier {
341febe289SDavid Zarzycki   std::this_thread::sleep_for(sleepTime);
355a83710eSEric Fiselier   p.set_value(3);
365a83710eSEric Fiselier }
375a83710eSEric Fiselier 
385a83710eSEric Fiselier int j = 0;
395a83710eSEric Fiselier 
func3(std::promise<int &> p)405a83710eSEric Fiselier void func3(std::promise<int&> p)
415a83710eSEric Fiselier {
421febe289SDavid Zarzycki   std::this_thread::sleep_for(sleepTime);
435a83710eSEric Fiselier   j = 5;
445a83710eSEric Fiselier   p.set_value(j);
455a83710eSEric Fiselier }
465a83710eSEric Fiselier 
func5(std::promise<void> p)475a83710eSEric Fiselier void func5(std::promise<void> p)
485a83710eSEric Fiselier {
491febe289SDavid Zarzycki   std::this_thread::sleep_for(sleepTime);
505a83710eSEric Fiselier   p.set_value();
515a83710eSEric Fiselier }
525a83710eSEric Fiselier 
main(int,char **)532df59c50SJF Bastien int main(int, char**)
545a83710eSEric Fiselier {
555a83710eSEric Fiselier   typedef std::chrono::high_resolution_clock Clock;
561febe289SDavid Zarzycki 
575a83710eSEric Fiselier   {
585a83710eSEric Fiselier     typedef int T;
595a83710eSEric Fiselier     std::promise<T> p;
605a83710eSEric Fiselier     std::shared_future<T> f = p.get_future();
6156462801SLouis Dionne     support::make_test_thread(func1, std::move(p)).detach();
625a83710eSEric Fiselier     assert(f.valid());
631febe289SDavid Zarzycki     assert(f.wait_for(ms(1)) == std::future_status::timeout);
645a83710eSEric Fiselier     assert(f.valid());
651febe289SDavid Zarzycki     assert(f.wait_for(waitTime) == std::future_status::ready);
665a83710eSEric Fiselier     assert(f.valid());
675a83710eSEric Fiselier     f.wait();
685a83710eSEric Fiselier     assert(f.valid());
695a83710eSEric Fiselier   }
705a83710eSEric Fiselier   {
715a83710eSEric Fiselier     typedef int& T;
725a83710eSEric Fiselier     std::promise<T> p;
735a83710eSEric Fiselier     std::shared_future<T> f = p.get_future();
7456462801SLouis Dionne     support::make_test_thread(func3, std::move(p)).detach();
755a83710eSEric Fiselier     assert(f.valid());
761febe289SDavid Zarzycki     assert(f.wait_for(ms(1)) == std::future_status::timeout);
775a83710eSEric Fiselier     assert(f.valid());
781febe289SDavid Zarzycki     assert(f.wait_for(waitTime) == std::future_status::ready);
795a83710eSEric Fiselier     assert(f.valid());
805a83710eSEric Fiselier     f.wait();
815a83710eSEric Fiselier     assert(f.valid());
825a83710eSEric Fiselier   }
835a83710eSEric Fiselier   {
845a83710eSEric Fiselier     typedef void T;
855a83710eSEric Fiselier     std::promise<T> p;
865a83710eSEric Fiselier     std::shared_future<T> f = p.get_future();
8756462801SLouis Dionne     support::make_test_thread(func5, std::move(p)).detach();
885a83710eSEric Fiselier     assert(f.valid());
891febe289SDavid Zarzycki     assert(f.wait_for(ms(1)) == std::future_status::timeout);
905a83710eSEric Fiselier     assert(f.valid());
911febe289SDavid Zarzycki     assert(f.wait_for(waitTime) == std::future_status::ready);
925a83710eSEric Fiselier     assert(f.valid());
931febe289SDavid Zarzycki     f.wait();
941febe289SDavid Zarzycki     assert(f.valid());
951febe289SDavid Zarzycki   }
961febe289SDavid Zarzycki 
971febe289SDavid Zarzycki   {
981febe289SDavid Zarzycki     typedef int T;
991febe289SDavid Zarzycki     std::promise<T> p;
1001febe289SDavid Zarzycki     std::shared_future<T> f = p.get_future();
1015a83710eSEric Fiselier     Clock::time_point t0 = Clock::now();
10256462801SLouis Dionne     support::make_test_thread(func1, std::move(p)).detach();
1031febe289SDavid Zarzycki     assert(f.valid());
1041febe289SDavid Zarzycki     assert(f.wait_for(ms(1)) == std::future_status::timeout);
1051febe289SDavid Zarzycki     assert(f.valid());
1065a83710eSEric Fiselier     f.wait();
1075a83710eSEric Fiselier     Clock::time_point t1 = Clock::now();
1085a83710eSEric Fiselier     assert(f.valid());
1091febe289SDavid Zarzycki     assert(t1 - t0 >= sleepTime);
1101febe289SDavid Zarzycki     assert(f.wait_for(waitTime) == std::future_status::ready);
1111febe289SDavid Zarzycki     assert(f.valid());
1121febe289SDavid Zarzycki   }
1131febe289SDavid Zarzycki   {
1141febe289SDavid Zarzycki     typedef int& T;
1151febe289SDavid Zarzycki     std::promise<T> p;
1161febe289SDavid Zarzycki     std::shared_future<T> f = p.get_future();
1171febe289SDavid Zarzycki     Clock::time_point t0 = Clock::now();
11856462801SLouis Dionne     support::make_test_thread(func3, std::move(p)).detach();
1191febe289SDavid Zarzycki     assert(f.valid());
1201febe289SDavid Zarzycki     assert(f.wait_for(ms(1)) == std::future_status::timeout);
1211febe289SDavid Zarzycki     assert(f.valid());
1221febe289SDavid Zarzycki     f.wait();
1231febe289SDavid Zarzycki     Clock::time_point t1 = Clock::now();
1241febe289SDavid Zarzycki     assert(f.valid());
1251febe289SDavid Zarzycki     assert(t1 - t0 >= sleepTime);
1261febe289SDavid Zarzycki     assert(f.wait_for(waitTime) == std::future_status::ready);
1271febe289SDavid Zarzycki     assert(f.valid());
1281febe289SDavid Zarzycki   }
1291febe289SDavid Zarzycki   {
1301febe289SDavid Zarzycki     typedef void T;
1311febe289SDavid Zarzycki     std::promise<T> p;
1321febe289SDavid Zarzycki     std::shared_future<T> f = p.get_future();
1331febe289SDavid Zarzycki     Clock::time_point t0 = Clock::now();
13456462801SLouis Dionne     support::make_test_thread(func5, std::move(p)).detach();
1351febe289SDavid Zarzycki     assert(f.valid());
1361febe289SDavid Zarzycki     assert(f.wait_for(ms(1)) == std::future_status::timeout);
1371febe289SDavid Zarzycki     assert(f.valid());
1381febe289SDavid Zarzycki     f.wait();
1391febe289SDavid Zarzycki     Clock::time_point t1 = Clock::now();
1401febe289SDavid Zarzycki     assert(f.valid());
1411febe289SDavid Zarzycki     assert(t1 - t0 >= sleepTime);
1421febe289SDavid Zarzycki     assert(f.wait_for(waitTime) == std::future_status::ready);
1431febe289SDavid Zarzycki     assert(f.valid());
1445a83710eSEric Fiselier   }
1452df59c50SJF Bastien 
1462df59c50SJF Bastien   return 0;
1475a83710eSEric Fiselier }
148