1adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant//===----------------------------------------------------------------------===// 2adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant// 3adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant// The LLVM Compiler Infrastructure 4adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant// 5adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open 6adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant// Source Licenses. See LICENSE.TXT for details. 7adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant// 8adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant//===----------------------------------------------------------------------===// 9adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant 10adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant// <mutex> 11adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant 12adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant// class recursive_timed_mutex; 13adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant 14adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant// template <class Clock, class Duration> 15adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant// bool try_lock_until(const chrono::time_point<Clock, Duration>& abs_time); 16adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant 17adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant#include <mutex> 18adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant#include <thread> 19adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant#include <cstdlib> 20adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant#include <cassert> 21adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant 22adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnantstd::recursive_timed_mutex m; 23adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant 24adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnanttypedef std::chrono::steady_clock Clock; 25adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnanttypedef Clock::time_point time_point; 26adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnanttypedef Clock::duration duration; 27adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnanttypedef std::chrono::milliseconds ms; 28adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnanttypedef std::chrono::nanoseconds ns; 29adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant 30adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnantvoid f1() 31adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant{ 32adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant time_point t0 = Clock::now(); 33adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant assert(m.try_lock_until(Clock::now() + ms(300)) == true); 34adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant time_point t1 = Clock::now(); 35adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant assert(m.try_lock()); 36adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant m.unlock(); 37adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant m.unlock(); 38adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant ns d = t1 - t0 - ms(250); 3966a48c5ad50704194df723ad9e13c7f1bb3c13f4Howard Hinnant assert(d < ms(50)); // within 50ms 40adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant} 41adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant 42adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnantvoid f2() 43adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant{ 44adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant time_point t0 = Clock::now(); 45adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant assert(m.try_lock_until(Clock::now() + ms(250)) == false); 46adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant time_point t1 = Clock::now(); 47adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant ns d = t1 - t0 - ms(250); 4866a48c5ad50704194df723ad9e13c7f1bb3c13f4Howard Hinnant assert(d < ms(50)); // within 50ms 49adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant} 50adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant 51adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnantint main() 52adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant{ 53adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant { 54adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant m.lock(); 55adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant std::thread t(f1); 56adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant std::this_thread::sleep_for(ms(250)); 57adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant m.unlock(); 58adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant t.join(); 59adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant } 60adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant { 61adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant m.lock(); 62adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant std::thread t(f2); 63adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant std::this_thread::sleep_for(ms(300)); 64adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant m.unlock(); 65adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant t.join(); 66adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant } 67adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant} 68