1abadb458d014e08ddc2bd17561cf7d264a60c173Marshall Clow//===----------------------------------------------------------------------===// 2abadb458d014e08ddc2bd17561cf7d264a60c173Marshall Clow// 3abadb458d014e08ddc2bd17561cf7d264a60c173Marshall Clow// The LLVM Compiler Infrastructure 4abadb458d014e08ddc2bd17561cf7d264a60c173Marshall Clow// 5abadb458d014e08ddc2bd17561cf7d264a60c173Marshall Clow// This file is dual licensed under the MIT and the University of Illinois Open 6abadb458d014e08ddc2bd17561cf7d264a60c173Marshall Clow// Source Licenses. See LICENSE.TXT for details. 7abadb458d014e08ddc2bd17561cf7d264a60c173Marshall Clow// 8abadb458d014e08ddc2bd17561cf7d264a60c173Marshall Clow//===----------------------------------------------------------------------===// 9abadb458d014e08ddc2bd17561cf7d264a60c173Marshall Clow// 10abadb458d014e08ddc2bd17561cf7d264a60c173Marshall Clow// UNSUPPORTED: libcpp-has-no-threads 11abadb458d014e08ddc2bd17561cf7d264a60c173Marshall Clow// UNSUPPORTED: c++03, c++98, c++11, c++14 12abadb458d014e08ddc2bd17561cf7d264a60c173Marshall Clow 13abadb458d014e08ddc2bd17561cf7d264a60c173Marshall Clow// <shared_mutex> 14abadb458d014e08ddc2bd17561cf7d264a60c173Marshall Clow 15abadb458d014e08ddc2bd17561cf7d264a60c173Marshall Clow// class shared_mutex; 16abadb458d014e08ddc2bd17561cf7d264a60c173Marshall Clow 17abadb458d014e08ddc2bd17561cf7d264a60c173Marshall Clow// bool try_lock(); 18abadb458d014e08ddc2bd17561cf7d264a60c173Marshall Clow 19abadb458d014e08ddc2bd17561cf7d264a60c173Marshall Clow#include <shared_mutex> 20abadb458d014e08ddc2bd17561cf7d264a60c173Marshall Clow#include <thread> 21abadb458d014e08ddc2bd17561cf7d264a60c173Marshall Clow#include <cstdlib> 22abadb458d014e08ddc2bd17561cf7d264a60c173Marshall Clow#include <cassert> 23abadb458d014e08ddc2bd17561cf7d264a60c173Marshall Clow 24abadb458d014e08ddc2bd17561cf7d264a60c173Marshall Clowstd::shared_mutex m; 25abadb458d014e08ddc2bd17561cf7d264a60c173Marshall Clow 26abadb458d014e08ddc2bd17561cf7d264a60c173Marshall Clowtypedef std::chrono::system_clock Clock; 27abadb458d014e08ddc2bd17561cf7d264a60c173Marshall Clowtypedef Clock::time_point time_point; 28abadb458d014e08ddc2bd17561cf7d264a60c173Marshall Clowtypedef Clock::duration duration; 29abadb458d014e08ddc2bd17561cf7d264a60c173Marshall Clowtypedef std::chrono::milliseconds ms; 30abadb458d014e08ddc2bd17561cf7d264a60c173Marshall Clowtypedef std::chrono::nanoseconds ns; 31abadb458d014e08ddc2bd17561cf7d264a60c173Marshall Clow 32abadb458d014e08ddc2bd17561cf7d264a60c173Marshall Clowvoid f() 33abadb458d014e08ddc2bd17561cf7d264a60c173Marshall Clow{ 34abadb458d014e08ddc2bd17561cf7d264a60c173Marshall Clow time_point t0 = Clock::now(); 35abadb458d014e08ddc2bd17561cf7d264a60c173Marshall Clow assert(!m.try_lock()); 36abadb458d014e08ddc2bd17561cf7d264a60c173Marshall Clow assert(!m.try_lock()); 37abadb458d014e08ddc2bd17561cf7d264a60c173Marshall Clow assert(!m.try_lock()); 38abadb458d014e08ddc2bd17561cf7d264a60c173Marshall Clow while(!m.try_lock()) 39abadb458d014e08ddc2bd17561cf7d264a60c173Marshall Clow ; 40abadb458d014e08ddc2bd17561cf7d264a60c173Marshall Clow time_point t1 = Clock::now(); 41abadb458d014e08ddc2bd17561cf7d264a60c173Marshall Clow m.unlock(); 42abadb458d014e08ddc2bd17561cf7d264a60c173Marshall Clow ns d = t1 - t0 - ms(250); 43abadb458d014e08ddc2bd17561cf7d264a60c173Marshall Clow assert(d < ms(200)); // within 200ms 44abadb458d014e08ddc2bd17561cf7d264a60c173Marshall Clow} 45abadb458d014e08ddc2bd17561cf7d264a60c173Marshall Clow 46abadb458d014e08ddc2bd17561cf7d264a60c173Marshall Clowint main() 47abadb458d014e08ddc2bd17561cf7d264a60c173Marshall Clow{ 48abadb458d014e08ddc2bd17561cf7d264a60c173Marshall Clow m.lock(); 49abadb458d014e08ddc2bd17561cf7d264a60c173Marshall Clow std::thread t(f); 50abadb458d014e08ddc2bd17561cf7d264a60c173Marshall Clow std::this_thread::sleep_for(ms(250)); 51abadb458d014e08ddc2bd17561cf7d264a60c173Marshall Clow m.unlock(); 52abadb458d014e08ddc2bd17561cf7d264a60c173Marshall Clow t.join(); 53abadb458d014e08ddc2bd17561cf7d264a60c173Marshall Clow} 54