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