| //===-- 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); | |
| } |