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