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