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//===----------------------------------------------------------------------===// 97112dae6acac544a0271a85d95342c583441e2d1Dan Albert// 107112dae6acac544a0271a85d95342c583441e2d1Dan Albert// UNSUPPORTED: libcpp-has-no-threads 11adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant 12adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant// <mutex> 13adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant 14adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant// class recursive_timed_mutex; 15adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant 16adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant// template <class Clock, class Duration> 17adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant// bool try_lock_until(const chrono::time_point<Clock, Duration>& abs_time); 18adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant 19adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant#include <mutex> 20adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant#include <thread> 21adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant#include <cstdlib> 22adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant#include <cassert> 23adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant 24adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnantstd::recursive_timed_mutex m; 25adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant 26adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnanttypedef std::chrono::steady_clock Clock; 27adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnanttypedef Clock::time_point time_point; 28adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnanttypedef Clock::duration duration; 29adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnanttypedef std::chrono::milliseconds ms; 30adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnanttypedef std::chrono::nanoseconds ns; 31adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant 32adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnantvoid f1() 33adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant{ 34adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant time_point t0 = Clock::now(); 35adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant assert(m.try_lock_until(Clock::now() + ms(300)) == true); 36adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant time_point t1 = Clock::now(); 37adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant assert(m.try_lock()); 38adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant m.unlock(); 39adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant m.unlock(); 40adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant ns d = t1 - t0 - ms(250); 4166a48c5ad50704194df723ad9e13c7f1bb3c13f4Howard Hinnant assert(d < ms(50)); // within 50ms 42adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant} 43adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant 44adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnantvoid f2() 45adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant{ 46adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant time_point t0 = Clock::now(); 47adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant assert(m.try_lock_until(Clock::now() + ms(250)) == false); 48adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant time_point t1 = Clock::now(); 49adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant ns d = t1 - t0 - ms(250); 5066a48c5ad50704194df723ad9e13c7f1bb3c13f4Howard Hinnant assert(d < ms(50)); // within 50ms 51adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant} 52adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant 53adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnantint main() 54adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant{ 55adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant { 56adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant m.lock(); 57adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant std::thread t(f1); 58adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant std::this_thread::sleep_for(ms(250)); 59adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant m.unlock(); 60adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant t.join(); 61adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant } 62adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant { 63adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant m.lock(); 64adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant std::thread t(f2); 65adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant std::this_thread::sleep_for(ms(300)); 66adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant m.unlock(); 67adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant t.join(); 68adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant } 69adaa6266fedc73dd2112fd074dcb5e12710fceb3Howard Hinnant} 70