//===-- Unittests for mutex -----------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "src/__support/CPP/mutex.h" #include "test/UnitTest/Test.h" using LIBC_NAMESPACE::cpp::adopt_lock; using LIBC_NAMESPACE::cpp::lock_guard; // Simple struct for testing cpp::lock_guard. It defines methods 'lock' and // 'unlock' which are required for the cpp::lock_guard class template. struct Mutex { // Flag to show whether this mutex is locked. bool locked = false; // Flag to show if this mutex has been double locked. bool double_locked = false; // Flag to show if this mutex has been double unlocked. bool double_unlocked = false; Mutex() {} void lock() { if (locked) double_locked = true; locked = true; } void unlock() { if (!locked) double_unlocked = true; locked = false; } }; TEST(LlvmLibcMutexTest, Basic) { Mutex m; ASSERT_FALSE(m.locked); ASSERT_FALSE(m.double_locked); ASSERT_FALSE(m.double_unlocked); { lock_guard lg(m); ASSERT_TRUE(m.locked); ASSERT_FALSE(m.double_locked); } ASSERT_FALSE(m.locked); ASSERT_FALSE(m.double_unlocked); } TEST(LlvmLibcMutexTest, AcquireLocked) { Mutex m; ASSERT_FALSE(m.locked); ASSERT_FALSE(m.double_locked); ASSERT_FALSE(m.double_unlocked); // Lock the mutex before placing a lock guard on it. m.lock(); ASSERT_TRUE(m.locked); ASSERT_FALSE(m.double_locked); { lock_guard lg(m, adopt_lock); ASSERT_TRUE(m.locked); ASSERT_FALSE(m.double_locked); } ASSERT_FALSE(m.locked); ASSERT_FALSE(m.double_unlocked); }