xref: /llvm-project/libcxx/test/support/checking_mutex.h (revision 9ff0468436c957fadcd8926683696a879cbc78a0)
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