1 //===----------------------------------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef TEST_SUPPORT_CHECKING_MUTEX_H 10 #define TEST_SUPPORT_CHECKING_MUTEX_H 11 12 #include <cassert> 13 #include <chrono> 14 15 struct checking_mutex { 16 enum state { 17 locked_via_lock, 18 locked_via_try_lock, 19 locked_via_try_lock_for, 20 locked_via_try_lock_until, 21 unlocked, 22 none, 23 }; 24 25 state current_state = unlocked; 26 state last_try = none; 27 bool reject = false; 28 29 checking_mutex() = default; 30 checking_mutex(const checking_mutex&) = delete; 31 ~checking_mutex() { assert(current_state == unlocked); } 32 33 void lock() { 34 assert(current_state == unlocked); 35 assert(!reject); 36 current_state = locked_via_lock; 37 last_try = locked_via_lock; 38 reject = true; 39 } 40 41 void unlock() { 42 assert(current_state != unlocked && current_state != none); 43 last_try = unlocked; 44 current_state = unlocked; 45 reject = false; 46 } 47 48 bool try_lock() { 49 last_try = locked_via_try_lock; 50 if (reject) 51 return false; 52 current_state = locked_via_try_lock; 53 return true; 54 } 55 56 template <class Rep, class Period> 57 bool try_lock_for(const std::chrono::duration<Rep, Period>&) { 58 last_try = locked_via_try_lock_for; 59 if (reject) 60 return false; 61 current_state = locked_via_try_lock_for; 62 return true; 63 } 64 65 template <class Clock, class Duration> 66 bool try_lock_until(const std::chrono::time_point<Clock, Duration>&) { 67 last_try = locked_via_try_lock_until; 68 if (reject) 69 return false; 70 current_state = locked_via_try_lock_until; 71 return true; 72 } 73 74 checking_mutex* operator&() = delete; 75 76 template <class T> 77 void operator,(const T&) = delete; 78 }; 79 80 #endif // TEST_SUPPORT_CHECKING_MUTEX_H 81