//===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #ifndef TEST_SUPPORT_CHECKING_MUTEX_H #define TEST_SUPPORT_CHECKING_MUTEX_H #include #include struct checking_mutex { enum state { locked_via_lock, locked_via_try_lock, locked_via_try_lock_for, locked_via_try_lock_until, unlocked, none, }; state current_state = unlocked; state last_try = none; bool reject = false; checking_mutex() = default; checking_mutex(const checking_mutex&) = delete; ~checking_mutex() { assert(current_state == unlocked); } void lock() { assert(current_state == unlocked); assert(!reject); current_state = locked_via_lock; last_try = locked_via_lock; reject = true; } void unlock() { assert(current_state != unlocked && current_state != none); last_try = unlocked; current_state = unlocked; reject = false; } bool try_lock() { last_try = locked_via_try_lock; if (reject) return false; current_state = locked_via_try_lock; return true; } template bool try_lock_for(const std::chrono::duration&) { last_try = locked_via_try_lock_for; if (reject) return false; current_state = locked_via_try_lock_for; return true; } template bool try_lock_until(const std::chrono::time_point&) { last_try = locked_via_try_lock_until; if (reject) return false; current_state = locked_via_try_lock_until; return true; } checking_mutex* operator&() = delete; template void operator,(const T&) = delete; }; #endif // TEST_SUPPORT_CHECKING_MUTEX_H