xref: /aosp_15_r20/external/scudo/standalone/condition_variable_base.h (revision 76559068c068bd27e82aff38fac3bfc865233bca)
1 //===-- condition_variable_base.h -------------------------------*- C++ -*-===//
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 SCUDO_CONDITION_VARIABLE_BASE_H_
10 #define SCUDO_CONDITION_VARIABLE_BASE_H_
11 
12 #include "mutex.h"
13 #include "thread_annotations.h"
14 
15 namespace scudo {
16 
17 template <typename Derived> class ConditionVariableBase {
18 public:
19   constexpr ConditionVariableBase() = default;
20 
bindTestOnly(HybridMutex & Mutex)21   void bindTestOnly(HybridMutex &Mutex) {
22 #if SCUDO_DEBUG
23     boundMutex = &Mutex;
24 #else
25     (void)Mutex;
26 #endif
27   }
28 
notifyAll(HybridMutex & M)29   void notifyAll(HybridMutex &M) REQUIRES(M) {
30 #if SCUDO_DEBUG
31     CHECK_EQ(&M, boundMutex);
32 #endif
33     getDerived()->notifyAllImpl(M);
34   }
35 
wait(HybridMutex & M)36   void wait(HybridMutex &M) REQUIRES(M) {
37 #if SCUDO_DEBUG
38     CHECK_EQ(&M, boundMutex);
39 #endif
40     getDerived()->waitImpl(M);
41   }
42 
43 protected:
getDerived()44   Derived *getDerived() { return static_cast<Derived *>(this); }
45 
46 #if SCUDO_DEBUG
47   // Because thread-safety analysis doesn't support pointer aliasing, we are not
48   // able to mark the proper annotations without false positive. Instead, we
49   // pass the lock and do the same-lock check separately.
50   HybridMutex *boundMutex = nullptr;
51 #endif
52 };
53 
54 } // namespace scudo
55 
56 #endif // SCUDO_CONDITION_VARIABLE_BASE_H_
57