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