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// <condition_variable>
11
12// class condition_variable_any;
13
14// template <class Lock, class Rep, class Period, class Predicate>
15//   bool
16//   wait_for(Lock& lock, const chrono::duration<Rep, Period>& rel_time,
17//            Predicate pred);
18
19#include <condition_variable>
20#include <mutex>
21#include <thread>
22#include <chrono>
23#include <cassert>
24
25class Pred
26{
27    int& i_;
28public:
29    explicit Pred(int& i) : i_(i) {}
30
31    bool operator()() {return i_ != 0;}
32};
33
34std::condition_variable_any cv;
35
36typedef std::timed_mutex L0;
37typedef std::unique_lock<L0> L1;
38
39L0 m0;
40
41int test1 = 0;
42int test2 = 0;
43
44int runs = 0;
45
46void f()
47{
48    typedef std::chrono::system_clock Clock;
49    typedef std::chrono::milliseconds milliseconds;
50    L1 lk(m0);
51    assert(test2 == 0);
52    test1 = 1;
53    cv.notify_one();
54    Clock::time_point t0 = Clock::now();
55    bool r = cv.wait_for(lk, milliseconds(250), Pred(test2));
56    Clock::time_point t1 = Clock::now();
57    if (runs == 0)
58    {
59        assert(t1 - t0 < milliseconds(250));
60        assert(test2 != 0);
61    }
62    else
63    {
64        assert(t1 - t0 - milliseconds(250) < milliseconds(50));
65        assert(test2 == 0);
66    }
67    ++runs;
68}
69
70int main()
71{
72    {
73        L1 lk(m0);
74        std::thread t(f);
75        assert(test1 == 0);
76        while (test1 == 0)
77            cv.wait(lk);
78        assert(test1 != 0);
79        test2 = 1;
80        lk.unlock();
81        cv.notify_one();
82        t.join();
83    }
84    test1 = 0;
85    test2 = 0;
86    {
87        L1 lk(m0);
88        std::thread t(f);
89        assert(test1 == 0);
90        while (test1 == 0)
91            cv.wait(lk);
92        assert(test1 != 0);
93        lk.unlock();
94        t.join();
95    }
96}
97