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