wait_until.pass.cpp revision b64f8b07c104c6cc986570ac8ee0ed16a9f23976
1//===----------------------------------------------------------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10// <future>
11
12// class future<R>
13
14// template <class Clock, class Duration>
15//   future_status
16//   wait_until(const chrono::time_point<Clock, Duration>& abs_time) const;
17
18#include <future>
19#include <cassert>
20
21typedef std::chrono::milliseconds ms;
22
23void func1(std::promise<int>& p)
24{
25    std::this_thread::sleep_for(ms(500));
26    p.set_value(3);
27}
28
29int j = 0;
30
31void func3(std::promise<int&>& p)
32{
33    std::this_thread::sleep_for(ms(500));
34    j = 5;
35    p.set_value(j);
36}
37
38void func5(std::promise<void>& p)
39{
40    std::this_thread::sleep_for(ms(500));
41    p.set_value();
42}
43
44int main()
45{
46    typedef std::chrono::high_resolution_clock Clock;
47    {
48        typedef int T;
49        std::promise<T> p;
50        std::future<T> f = p.get_future();
51        std::thread(func1, std::move(p)).detach();
52        assert(f.valid());
53        assert(f.wait_until(Clock::now() + ms(300)) == std::future_status::timeout);
54        assert(f.valid());
55        assert(f.wait_until(Clock::now() + ms(300)) == std::future_status::ready);
56        assert(f.valid());
57        Clock::time_point t0 = Clock::now();
58        f.wait();
59        Clock::time_point t1 = Clock::now();
60        assert(f.valid());
61        assert(t1-t0 < ms(5));
62    }
63    {
64        typedef int& T;
65        std::promise<T> p;
66        std::future<T> f = p.get_future();
67        std::thread(func3, std::move(p)).detach();
68        assert(f.valid());
69        assert(f.wait_until(Clock::now() + ms(300)) == std::future_status::timeout);
70        assert(f.valid());
71        assert(f.wait_until(Clock::now() + ms(300)) == std::future_status::ready);
72        assert(f.valid());
73        Clock::time_point t0 = Clock::now();
74        f.wait();
75        Clock::time_point t1 = Clock::now();
76        assert(f.valid());
77        assert(t1-t0 < ms(5));
78    }
79    {
80        typedef void T;
81        std::promise<T> p;
82        std::future<T> f = p.get_future();
83        std::thread(func5, std::move(p)).detach();
84        assert(f.valid());
85        assert(f.wait_until(Clock::now() + ms(300)) == std::future_status::timeout);
86        assert(f.valid());
87        assert(f.wait_until(Clock::now() + ms(300)) == std::future_status::ready);
88        assert(f.valid());
89        Clock::time_point t0 = Clock::now();
90        f.wait();
91        Clock::time_point t1 = Clock::now();
92        assert(f.valid());
93        assert(t1-t0 < ms(5));
94    }
95}
96