1 //===----------------------------------------------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // UNSUPPORTED: libcpp-has-no-threads
11 
12 // <mutex>
13 
14 // template <class Mutex> class unique_lock;
15 
16 // bool try_lock();
17 
18 #include <mutex>
19 #include <cassert>
20 
21 bool try_lock_called = false;
22 
23 struct mutex
24 {
try_lockmutex25     bool try_lock()
26     {
27         try_lock_called = !try_lock_called;
28         return try_lock_called;
29     }
unlockmutex30     void unlock() {}
31 };
32 
33 mutex m;
34 
main()35 int main()
36 {
37     std::unique_lock<mutex> lk(m, std::defer_lock);
38     assert(lk.try_lock() == true);
39     assert(try_lock_called == true);
40     assert(lk.owns_lock() == true);
41     try
42     {
43         lk.try_lock();
44         assert(false);
45     }
46     catch (std::system_error& e)
47     {
48         assert(e.code().value() == EDEADLK);
49     }
50     lk.unlock();
51     assert(lk.try_lock() == false);
52     assert(try_lock_called == false);
53     assert(lk.owns_lock() == false);
54     lk.release();
55     try
56     {
57         lk.try_lock();
58         assert(false);
59     }
60     catch (std::system_error& e)
61     {
62         assert(e.code().value() == EPERM);
63     }
64 }
65