1ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant//===----------------------------------------------------------------------===//
2ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant//
3ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant//                     The LLVM Compiler Infrastructure
4ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant//
5ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
6ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant// Source Licenses. See LICENSE.TXT for details.
7ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant//
8ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant//===----------------------------------------------------------------------===//
9ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant
10ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant// <shared_mutex>
11ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant
12f9f95be93091c60e7c9034670f298d5a2fba8686David Majnemer// class shared_timed_mutex;
13ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant
14ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant// template <class Clock, class Duration>
15ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant//   shared_lock(mutex_type& m, const chrono::time_point<Clock, Duration>& abs_time);
16ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant
17ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant#include <shared_mutex>
18ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant#include <thread>
19ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant#include <vector>
20ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant#include <cstdlib>
21ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant#include <cassert>
22ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant
23ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant#if _LIBCPP_STD_VER > 11
24ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant
25f9f95be93091c60e7c9034670f298d5a2fba8686David Majnemerstd::shared_timed_mutex m;
26ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant
27ba898e42081aec544a04d282834aa99b13d57803Howard Hinnanttypedef std::chrono::steady_clock Clock;
28ba898e42081aec544a04d282834aa99b13d57803Howard Hinnanttypedef Clock::time_point time_point;
29ba898e42081aec544a04d282834aa99b13d57803Howard Hinnanttypedef Clock::duration duration;
30ba898e42081aec544a04d282834aa99b13d57803Howard Hinnanttypedef std::chrono::milliseconds ms;
31ba898e42081aec544a04d282834aa99b13d57803Howard Hinnanttypedef std::chrono::nanoseconds ns;
32ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant
33ba898e42081aec544a04d282834aa99b13d57803Howard Hinnantvoid f1()
34ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant{
35ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant    time_point t0 = Clock::now();
36f9f95be93091c60e7c9034670f298d5a2fba8686David Majnemer    std::shared_lock<std::shared_timed_mutex> lk(m, Clock::now() + ms(300));
37ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant    assert(lk.owns_lock() == true);
38ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant    time_point t1 = Clock::now();
39ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant    ns d = t1 - t0 - ms(250);
40ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant    assert(d < ns(50000000));  // within 50ms
41ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant}
42ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant
43ba898e42081aec544a04d282834aa99b13d57803Howard Hinnantvoid f2()
44ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant{
45ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant    time_point t0 = Clock::now();
46f9f95be93091c60e7c9034670f298d5a2fba8686David Majnemer    std::shared_lock<std::shared_timed_mutex> lk(m, Clock::now() + ms(250));
47ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant    assert(lk.owns_lock() == false);
48ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant    time_point t1 = Clock::now();
49ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant    ns d = t1 - t0 - ms(250);
50ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant    assert(d < ms(50));  // within 50ms
51ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant}
52ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant
53ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant#endif  // _LIBCPP_STD_VER > 11
54ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant
55ba898e42081aec544a04d282834aa99b13d57803Howard Hinnantint main()
56ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant{
57ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant#if _LIBCPP_STD_VER > 11
58ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant    {
59ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant        m.lock();
60ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant        std::vector<std::thread> v;
61ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant        for (int i = 0; i < 5; ++i)
62ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant            v.push_back(std::thread(f1));
63ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant        std::this_thread::sleep_for(ms(250));
64ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant        m.unlock();
65ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant        for (auto& t : v)
66ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant            t.join();
67ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant    }
68ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant    {
69ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant        m.lock();
70ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant        std::vector<std::thread> v;
71ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant        for (int i = 0; i < 5; ++i)
72ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant            v.push_back(std::thread(f2));
73ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant        std::this_thread::sleep_for(ms(300));
74ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant        m.unlock();
75ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant        for (auto& t : v)
76ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant            t.join();
77ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant    }
78ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant#endif  // _LIBCPP_STD_VER > 11
79ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant}
80