1 //===-- condition_variable.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_H_ 10 #define SCUDO_CONDITION_VARIABLE_H_ 11 12 #include "condition_variable_base.h" 13 14 #include "common.h" 15 #include "platform.h" 16 17 #include "condition_variable_linux.h" 18 19 namespace scudo { 20 21 // A default implementation of default condition variable. It doesn't do a real 22 // `wait`, instead it spins a short amount of time only. 23 class ConditionVariableDummy 24 : public ConditionVariableBase<ConditionVariableDummy> { 25 public: 26 void notifyAllImpl(UNUSED HybridMutex &M) REQUIRES(M) {} 27 28 void waitImpl(UNUSED HybridMutex &M) REQUIRES(M) { 29 M.unlock(); 30 31 constexpr u32 SpinTimes = 64; 32 volatile u32 V = 0; 33 for (u32 I = 0; I < SpinTimes; ++I) { 34 u32 Tmp = V + 1; 35 V = Tmp; 36 } 37 38 M.lock(); 39 } 40 }; 41 42 template <typename Config, typename = const bool> 43 struct ConditionVariableState { 44 static constexpr bool enabled() { return false; } 45 // This is only used for compilation purpose so that we won't end up having 46 // many conditional compilations. If you want to use `ConditionVariableDummy`, 47 // define `ConditionVariableT` in your allocator configuration. See 48 // allocator_config.h for more details. 49 using ConditionVariableT = ConditionVariableDummy; 50 }; 51 52 template <typename Config> 53 struct ConditionVariableState<Config, decltype(Config::UseConditionVariable)> { 54 static constexpr bool enabled() { return Config::UseConditionVariable; } 55 using ConditionVariableT = typename Config::ConditionVariableT; 56 }; 57 58 } // namespace scudo 59 60 #endif // SCUDO_CONDITION_VARIABLE_H_ 61