]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | // Copyright (C) 2012 Vicente J. Botet Escriba |
2 | // | |
3 | // Distributed under the Boost Software License, Version 1.0. (See accompanying | |
4 | // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) | |
5 | ||
6 | // <boost/thread/locks.hpp> | |
7 | ||
8 | // template <class Mutex> class unique_lock; | |
9 | // unique_lock<Mutex> make_unique_lock(Mutex&, try_to_lock_t); | |
10 | ||
11 | #define BOOST_THREAD_VERSION 4 | |
12 | ||
13 | ||
14 | #include <boost/thread/lock_factories.hpp> | |
15 | #include <boost/thread/mutex.hpp> | |
16 | #include <boost/thread/thread.hpp> | |
17 | #include <boost/detail/lightweight_test.hpp> | |
92f5a8d4 | 18 | #include "../../../../../timming.hpp" |
7c673cae FG |
19 | |
20 | boost::mutex m; | |
21 | ||
22 | #if defined BOOST_THREAD_USES_CHRONO | |
92f5a8d4 | 23 | typedef boost::chrono::high_resolution_clock Clock; |
7c673cae FG |
24 | typedef Clock::time_point time_point; |
25 | typedef Clock::duration duration; | |
26 | typedef boost::chrono::milliseconds ms; | |
27 | typedef boost::chrono::nanoseconds ns; | |
92f5a8d4 TL |
28 | time_point t0; |
29 | time_point t1; | |
7c673cae FG |
30 | #else |
31 | #endif | |
32 | ||
92f5a8d4 | 33 | const ms max_diff(BOOST_THREAD_TEST_TIME_MS); |
11fdf7f2 | 34 | |
7c673cae FG |
35 | void f() |
36 | { | |
37 | #if defined BOOST_THREAD_USES_CHRONO | |
38 | { | |
92f5a8d4 | 39 | t0 = Clock::now(); |
7c673cae FG |
40 | #if ! defined(BOOST_NO_CXX11_AUTO_DECLARATIONS) |
41 | auto | |
42 | #else | |
43 | boost::unique_lock<boost::mutex> | |
44 | #endif | |
45 | lk = boost::make_unique_lock(m, boost::try_to_lock); | |
46 | BOOST_TEST(lk.owns_lock() == false); | |
92f5a8d4 TL |
47 | t1 = Clock::now(); |
48 | ns d = t1 - t0; | |
49 | BOOST_THREAD_TEST_IT(d, ns(max_diff)); | |
7c673cae FG |
50 | } |
51 | { | |
92f5a8d4 | 52 | t0 = Clock::now(); |
7c673cae FG |
53 | #if ! defined(BOOST_NO_CXX11_AUTO_DECLARATIONS) |
54 | auto | |
55 | #else | |
56 | boost::unique_lock<boost::mutex> | |
57 | #endif | |
58 | lk = boost::make_unique_lock(m, boost::try_to_lock); | |
59 | BOOST_TEST(lk.owns_lock() == false); | |
92f5a8d4 TL |
60 | t1 = Clock::now(); |
61 | ns d = t1 - t0; | |
62 | BOOST_THREAD_TEST_IT(d, ns(max_diff)); | |
7c673cae FG |
63 | } |
64 | { | |
92f5a8d4 | 65 | t0 = Clock::now(); |
7c673cae FG |
66 | #if ! defined(BOOST_NO_CXX11_AUTO_DECLARATIONS) |
67 | auto | |
68 | #else | |
69 | boost::unique_lock<boost::mutex> | |
70 | #endif | |
71 | lk = boost::make_unique_lock(m, boost::try_to_lock); | |
72 | BOOST_TEST(lk.owns_lock() == false); | |
92f5a8d4 TL |
73 | t1 = Clock::now(); |
74 | ns d = t1 - t0; | |
75 | BOOST_THREAD_TEST_IT(d, ns(max_diff)); | |
7c673cae FG |
76 | } |
77 | { | |
92f5a8d4 | 78 | t0 = Clock::now(); |
7c673cae FG |
79 | for (;;) |
80 | { | |
81 | #if ! defined(BOOST_NO_CXX11_AUTO_DECLARATIONS) | |
82 | auto | |
83 | #else | |
84 | boost::unique_lock<boost::mutex> | |
85 | #endif | |
86 | lk = boost::make_unique_lock(m, boost::try_to_lock); | |
92f5a8d4 TL |
87 | if (lk.owns_lock()) { |
88 | t1 = Clock::now(); | |
89 | break; | |
90 | } | |
7c673cae | 91 | } |
7c673cae FG |
92 | } |
93 | #else | |
94 | // time_point t0 = Clock::now(); | |
95 | // { | |
96 | // boost::unique_lock<boost::mutex> lk(m, boost::try_to_lock); | |
97 | // BOOST_TEST(lk.owns_lock() == false); | |
98 | // } | |
99 | // { | |
100 | // boost::unique_lock<boost::mutex> lk(m, boost::try_to_lock); | |
101 | // BOOST_TEST(lk.owns_lock() == false); | |
102 | // } | |
103 | // { | |
104 | // boost::unique_lock<boost::mutex> lk(m, boost::try_to_lock); | |
105 | // BOOST_TEST(lk.owns_lock() == false); | |
106 | // } | |
b32b8144 | 107 | for (;;) |
7c673cae FG |
108 | { |
109 | #if ! defined(BOOST_NO_CXX11_AUTO_DECLARATIONS) | |
110 | auto | |
111 | #else | |
112 | boost::unique_lock<boost::mutex> | |
113 | #endif | |
114 | lk = boost::make_unique_lock(m, boost::try_to_lock); | |
115 | if (lk.owns_lock()) break; | |
116 | } | |
117 | //time_point t1 = Clock::now(); | |
118 | //ns d = t1 - t0 - ms(250); | |
11fdf7f2 | 119 | //BOOST_TEST(d < max_diff); |
7c673cae FG |
120 | #endif |
121 | } | |
122 | ||
123 | int main() | |
124 | { | |
125 | m.lock(); | |
126 | boost::thread t(f); | |
127 | #if defined BOOST_THREAD_USES_CHRONO | |
92f5a8d4 | 128 | time_point t2 = Clock::now(); |
7c673cae | 129 | boost::this_thread::sleep_for(ms(250)); |
92f5a8d4 | 130 | time_point t3 = Clock::now(); |
7c673cae FG |
131 | #else |
132 | #endif | |
133 | m.unlock(); | |
134 | t.join(); | |
135 | ||
92f5a8d4 TL |
136 | #if defined BOOST_THREAD_USES_CHRONO |
137 | ns sleep_time = t3 - t2; | |
138 | ns d_ns = t1 - t0 - sleep_time; | |
139 | ms d_ms = boost::chrono::duration_cast<boost::chrono::milliseconds>(d_ns); | |
140 | // BOOST_TEST_GE(d_ms.count(), 0); | |
141 | BOOST_THREAD_TEST_IT(d_ms, max_diff); | |
142 | BOOST_THREAD_TEST_IT(d_ns, ns(max_diff)); | |
143 | #endif | |
144 | ||
7c673cae FG |
145 | return boost::report_errors(); |
146 | } |