]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/thread/test/sync/conditions/condition_variable/wait_until_pass.cpp
update sources to v12.2.3
[ceph.git] / ceph / src / boost / libs / thread / test / sync / conditions / condition_variable / wait_until_pass.cpp
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 // Copyright (C) 2011 Vicente J. Botet Escriba
10 //
11 // Distributed under the Boost Software License, Version 1.0. (See accompanying
12 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
13
14 // <boost/thread/condition_variable>
15
16 // class condition_variable;
17
18 // condition_variable(const condition_variable&) = delete;
19
20 #include <boost/thread/condition_variable.hpp>
21 #include <boost/thread/mutex.hpp>
22 #include <boost/thread/thread.hpp>
23 #include <boost/detail/lightweight_test.hpp>
24 #include <iostream>
25 #include <cassert>
26
27 #if defined BOOST_THREAD_USES_CHRONO
28
29 struct Clock
30 {
31 typedef boost::chrono::milliseconds duration;
32 typedef duration::rep rep;
33 typedef duration::period period;
34 typedef boost::chrono::time_point<Clock> time_point;
35 static const bool is_steady = true;
36
37 static time_point now()
38 {
39 using namespace boost::chrono;
40 return time_point(duration_cast<duration> (steady_clock::now().time_since_epoch()));
41 }
42 };
43
44 boost::condition_variable cv;
45 boost::mutex mut;
46
47 int test1 = 0;
48 int test2 = 0;
49
50 int runs = 0;
51
52 void f()
53 {
54 try {
55 boost::unique_lock < boost::mutex > lk(mut);
56 assert(test2 == 0);
57 test1 = 1;
58 cv.notify_one();
59 Clock::time_point t0 = Clock::now();
60 Clock::time_point t = t0 + Clock::duration(250);
61 int count=0;
62 while (test2 == 0 && cv.wait_until(lk, t) == boost::cv_status::no_timeout)
63 count++;
64 Clock::time_point t1 = Clock::now();
65 if (runs == 0)
66 {
67 assert(t1 - t0 < Clock::duration(250));
68 assert(test2 != 0);
69 }
70 else
71 {
72 // This test is spurious as it depends on the time the thread system switches the threads
73 assert(t1 - t0 - Clock::duration(250) < Clock::duration(count*250+5+1000));
74 assert(test2 == 0);
75 }
76 ++runs;
77 } catch(...) {
78 assert(false);
79 std::cout << "ERROR exception" << __LINE__ << std::endl;
80 }
81 }
82
83 int main()
84 {
85 try
86 {
87 boost::unique_lock < boost::mutex > lk(mut);
88 boost::thread t(f);
89 BOOST_TEST(test1 == 0);
90 while (test1 == 0)
91 cv.wait(lk);
92 BOOST_TEST(test1 != 0);
93 test2 = 1;
94 lk.unlock();
95 cv.notify_one();
96 t.join();
97 } catch(...) {
98 BOOST_TEST(false);
99 std::cout << "ERROR exception" << __LINE__ << std::endl;
100 }
101
102 test1 = 0;
103 test2 = 0;
104 try
105 {
106 boost::unique_lock < boost::mutex > lk(mut);
107 boost::thread t(f);
108 BOOST_TEST(test1 == 0);
109 while (test1 == 0)
110 cv.wait(lk);
111 BOOST_TEST(test1 != 0);
112 lk.unlock();
113 t.join();
114 } catch(...) {
115 BOOST_TEST(false);
116 std::cout << "ERROR exception" << __LINE__ << std::endl;
117 }
118
119 return boost::report_errors();
120 }
121
122 #else
123 #error "Test not applicable: BOOST_THREAD_USES_CHRONO not defined for this platform as not supported"
124 #endif