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 // Copyright (C) 2012 Vicente J. Botet Escriba 11 // 12 // Distributed under the Boost Software License, Version 1.0. (See accompanying 13 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 14 15 // <boost/thread/lock_guard.hpp> 16 17 // template <class Lockable> 18 // lock_guard<Lockable> make_lock_guard(Lockable &, adopt_lock_t); 19 20 #define BOOST_THREAD_VERSION 4 21 22 #include <boost/thread/lock_guard.hpp> 23 #include <boost/thread/mutex.hpp> 24 #include <boost/thread/thread.hpp> 25 #include <boost/detail/lightweight_test.hpp> 26 #include "../../../../timming.hpp" 27 28 29 #ifdef BOOST_THREAD_USES_CHRONO 30 typedef boost::chrono::high_resolution_clock Clock; 31 typedef Clock::time_point time_point; 32 typedef Clock::duration duration; 33 typedef boost::chrono::milliseconds ms; 34 typedef boost::chrono::nanoseconds ns; 35 time_point t0; 36 time_point t1; 37 #endif 38 boost::mutex m; 39 40 #if ! defined(BOOST_NO_CXX11_AUTO_DECLARATIONS) && ! defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && ! defined BOOST_THREAD_NO_MAKE_LOCK_GUARD 41 42 const ms max_diff(BOOST_THREAD_TEST_TIME_MS); 43 f()44void f() 45 { 46 #ifdef BOOST_THREAD_USES_CHRONO 47 t0 = Clock::now(); 48 { 49 m.lock(); 50 auto&& lg = boost::make_lock_guard(m, boost::adopt_lock); (void)lg; 51 52 t1 = Clock::now(); 53 } 54 #else 55 //time_point t0 = Clock::now(); 56 //time_point t1; 57 { 58 m.lock(); 59 auto&& lg = boost::make_lock_guard(m, boost::adopt_lock); (void)lg; 60 //t1 = Clock::now(); 61 } 62 //ns d = t1 - t0 - ms(250); 63 //BOOST_TEST(d < max_diff); 64 #endif 65 } 66 #endif 67 main()68int main() 69 { 70 #if ! defined(BOOST_NO_CXX11_AUTO_DECLARATIONS) && ! defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && ! defined BOOST_THREAD_NO_MAKE_LOCK_GUARD 71 m.lock(); 72 boost::thread t(f); 73 #ifdef BOOST_THREAD_USES_CHRONO 74 time_point t2 = Clock::now(); 75 boost::this_thread::sleep_for(ms(250)); 76 time_point t3 = Clock::now(); 77 #endif 78 m.unlock(); 79 t.join(); 80 81 #if defined BOOST_THREAD_USES_CHRONO 82 ns sleep_time = t3 - t2; 83 ns d_ns = t1 - t0 - sleep_time; 84 ms d_ms = boost::chrono::duration_cast<boost::chrono::milliseconds>(d_ns); 85 // BOOST_TEST_GE(d_ms.count(), 0); 86 BOOST_THREAD_TEST_IT(d_ms, max_diff); 87 BOOST_THREAD_TEST_IT(d_ns, ns(max_diff)); 88 #endif 89 90 #endif 91 return boost::report_errors(); 92 } 93 94