]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/thread/test/sync/mutual_exclusion/locks/unique_lock/cons/make_unique_lock_try_to_lock_pass.cpp
import new upstream nautilus stable release 14.2.8
[ceph.git] / ceph / src / boost / libs / thread / test / sync / mutual_exclusion / locks / unique_lock / cons / make_unique_lock_try_to_lock_pass.cpp
CommitLineData
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
20boost::mutex m;
21
22#if defined BOOST_THREAD_USES_CHRONO
92f5a8d4 23typedef boost::chrono::high_resolution_clock Clock;
7c673cae
FG
24typedef Clock::time_point time_point;
25typedef Clock::duration duration;
26typedef boost::chrono::milliseconds ms;
27typedef boost::chrono::nanoseconds ns;
92f5a8d4
TL
28time_point t0;
29time_point t1;
7c673cae
FG
30#else
31#endif
32
92f5a8d4 33const ms max_diff(BOOST_THREAD_TEST_TIME_MS);
11fdf7f2 34
7c673cae
FG
35void 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
123int 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}