1*76559068SAndroid Build Coastguard Worker //===-- condition_variable_base.h -------------------------------*- C++ -*-===// 2*76559068SAndroid Build Coastguard Worker // 3*76559068SAndroid Build Coastguard Worker // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*76559068SAndroid Build Coastguard Worker // See https://llvm.org/LICENSE.txt for license information. 5*76559068SAndroid Build Coastguard Worker // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*76559068SAndroid Build Coastguard Worker // 7*76559068SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 8*76559068SAndroid Build Coastguard Worker 9*76559068SAndroid Build Coastguard Worker #ifndef SCUDO_CONDITION_VARIABLE_BASE_H_ 10*76559068SAndroid Build Coastguard Worker #define SCUDO_CONDITION_VARIABLE_BASE_H_ 11*76559068SAndroid Build Coastguard Worker 12*76559068SAndroid Build Coastguard Worker #include "mutex.h" 13*76559068SAndroid Build Coastguard Worker #include "thread_annotations.h" 14*76559068SAndroid Build Coastguard Worker 15*76559068SAndroid Build Coastguard Worker namespace scudo { 16*76559068SAndroid Build Coastguard Worker 17*76559068SAndroid Build Coastguard Worker template <typename Derived> class ConditionVariableBase { 18*76559068SAndroid Build Coastguard Worker public: 19*76559068SAndroid Build Coastguard Worker constexpr ConditionVariableBase() = default; 20*76559068SAndroid Build Coastguard Worker bindTestOnly(HybridMutex & Mutex)21*76559068SAndroid Build Coastguard Worker void bindTestOnly(HybridMutex &Mutex) { 22*76559068SAndroid Build Coastguard Worker #if SCUDO_DEBUG 23*76559068SAndroid Build Coastguard Worker boundMutex = &Mutex; 24*76559068SAndroid Build Coastguard Worker #else 25*76559068SAndroid Build Coastguard Worker (void)Mutex; 26*76559068SAndroid Build Coastguard Worker #endif 27*76559068SAndroid Build Coastguard Worker } 28*76559068SAndroid Build Coastguard Worker notifyAll(HybridMutex & M)29*76559068SAndroid Build Coastguard Worker void notifyAll(HybridMutex &M) REQUIRES(M) { 30*76559068SAndroid Build Coastguard Worker #if SCUDO_DEBUG 31*76559068SAndroid Build Coastguard Worker CHECK_EQ(&M, boundMutex); 32*76559068SAndroid Build Coastguard Worker #endif 33*76559068SAndroid Build Coastguard Worker getDerived()->notifyAllImpl(M); 34*76559068SAndroid Build Coastguard Worker } 35*76559068SAndroid Build Coastguard Worker wait(HybridMutex & M)36*76559068SAndroid Build Coastguard Worker void wait(HybridMutex &M) REQUIRES(M) { 37*76559068SAndroid Build Coastguard Worker #if SCUDO_DEBUG 38*76559068SAndroid Build Coastguard Worker CHECK_EQ(&M, boundMutex); 39*76559068SAndroid Build Coastguard Worker #endif 40*76559068SAndroid Build Coastguard Worker getDerived()->waitImpl(M); 41*76559068SAndroid Build Coastguard Worker } 42*76559068SAndroid Build Coastguard Worker 43*76559068SAndroid Build Coastguard Worker protected: getDerived()44*76559068SAndroid Build Coastguard Worker Derived *getDerived() { return static_cast<Derived *>(this); } 45*76559068SAndroid Build Coastguard Worker 46*76559068SAndroid Build Coastguard Worker #if SCUDO_DEBUG 47*76559068SAndroid Build Coastguard Worker // Because thread-safety analysis doesn't support pointer aliasing, we are not 48*76559068SAndroid Build Coastguard Worker // able to mark the proper annotations without false positive. Instead, we 49*76559068SAndroid Build Coastguard Worker // pass the lock and do the same-lock check separately. 50*76559068SAndroid Build Coastguard Worker HybridMutex *boundMutex = nullptr; 51*76559068SAndroid Build Coastguard Worker #endif 52*76559068SAndroid Build Coastguard Worker }; 53*76559068SAndroid Build Coastguard Worker 54*76559068SAndroid Build Coastguard Worker } // namespace scudo 55*76559068SAndroid Build Coastguard Worker 56*76559068SAndroid Build Coastguard Worker #endif // SCUDO_CONDITION_VARIABLE_BASE_H_ 57