1*76559068SAndroid Build Coastguard Worker //===-- condition_variable_test.cpp -----------------------------*- 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 #include "tests/scudo_unit_test.h" 10*76559068SAndroid Build Coastguard Worker 11*76559068SAndroid Build Coastguard Worker #include "common.h" 12*76559068SAndroid Build Coastguard Worker #include "condition_variable.h" 13*76559068SAndroid Build Coastguard Worker #include "mutex.h" 14*76559068SAndroid Build Coastguard Worker 15*76559068SAndroid Build Coastguard Worker #include <thread> 16*76559068SAndroid Build Coastguard Worker simpleWaitAndNotifyAll()17*76559068SAndroid Build Coastguard Workertemplate <typename ConditionVariableT> void simpleWaitAndNotifyAll() { 18*76559068SAndroid Build Coastguard Worker constexpr scudo::u32 NumThreads = 2; 19*76559068SAndroid Build Coastguard Worker constexpr scudo::u32 CounterMax = 1024; 20*76559068SAndroid Build Coastguard Worker std::thread Threads[NumThreads]; 21*76559068SAndroid Build Coastguard Worker 22*76559068SAndroid Build Coastguard Worker scudo::HybridMutex M; 23*76559068SAndroid Build Coastguard Worker ConditionVariableT CV; 24*76559068SAndroid Build Coastguard Worker CV.bindTestOnly(M); 25*76559068SAndroid Build Coastguard Worker scudo::u32 Counter = 0; 26*76559068SAndroid Build Coastguard Worker 27*76559068SAndroid Build Coastguard Worker for (scudo::u32 I = 0; I < NumThreads; ++I) { 28*76559068SAndroid Build Coastguard Worker Threads[I] = std::thread( 29*76559068SAndroid Build Coastguard Worker [&](scudo::u32 Id) { 30*76559068SAndroid Build Coastguard Worker do { 31*76559068SAndroid Build Coastguard Worker scudo::ScopedLock L(M); 32*76559068SAndroid Build Coastguard Worker if (Counter % NumThreads != Id && Counter < CounterMax) 33*76559068SAndroid Build Coastguard Worker CV.wait(M); 34*76559068SAndroid Build Coastguard Worker if (Counter >= CounterMax) { 35*76559068SAndroid Build Coastguard Worker break; 36*76559068SAndroid Build Coastguard Worker } else { 37*76559068SAndroid Build Coastguard Worker ++Counter; 38*76559068SAndroid Build Coastguard Worker CV.notifyAll(M); 39*76559068SAndroid Build Coastguard Worker } 40*76559068SAndroid Build Coastguard Worker } while (true); 41*76559068SAndroid Build Coastguard Worker }, 42*76559068SAndroid Build Coastguard Worker I); 43*76559068SAndroid Build Coastguard Worker } 44*76559068SAndroid Build Coastguard Worker 45*76559068SAndroid Build Coastguard Worker for (std::thread &T : Threads) 46*76559068SAndroid Build Coastguard Worker T.join(); 47*76559068SAndroid Build Coastguard Worker 48*76559068SAndroid Build Coastguard Worker EXPECT_EQ(Counter, CounterMax); 49*76559068SAndroid Build Coastguard Worker } 50*76559068SAndroid Build Coastguard Worker TEST(ScudoConditionVariableTest,DummyCVWaitAndNotifyAll)51*76559068SAndroid Build Coastguard WorkerTEST(ScudoConditionVariableTest, DummyCVWaitAndNotifyAll) { 52*76559068SAndroid Build Coastguard Worker simpleWaitAndNotifyAll<scudo::ConditionVariableDummy>(); 53*76559068SAndroid Build Coastguard Worker } 54*76559068SAndroid Build Coastguard Worker 55*76559068SAndroid Build Coastguard Worker #ifdef SCUDO_LINUX TEST(ScudoConditionVariableTest,LinuxCVWaitAndNotifyAll)56*76559068SAndroid Build Coastguard WorkerTEST(ScudoConditionVariableTest, LinuxCVWaitAndNotifyAll) { 57*76559068SAndroid Build Coastguard Worker simpleWaitAndNotifyAll<scudo::ConditionVariableLinux>(); 58*76559068SAndroid Build Coastguard Worker } 59*76559068SAndroid Build Coastguard Worker #endif 60