xref: /llvm-project/libc/test/src/__support/CPP/mutex_test.cpp (revision c4a3d184db5fdffe798208b8281dfe944616f9ed)
1 //===-- Unittests for mutex -----------------------------------------------===//
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 #include "src/__support/CPP/mutex.h"
10 #include "test/UnitTest/Test.h"
11 
12 using LIBC_NAMESPACE::cpp::adopt_lock;
13 using LIBC_NAMESPACE::cpp::lock_guard;
14 
15 // Simple struct for testing cpp::lock_guard. It defines methods 'lock' and
16 // 'unlock' which are required for the cpp::lock_guard class template.
17 struct Mutex {
18   // Flag to show whether this mutex is locked.
19   bool locked = false;
20 
21   // Flag to show if this mutex has been double locked.
22   bool double_locked = false;
23 
24   // Flag to show if this mutex has been double unlocked.
25   bool double_unlocked = false;
26 
MutexMutex27   Mutex() {}
28 
lockMutex29   void lock() {
30     if (locked)
31       double_locked = true;
32 
33     locked = true;
34   }
35 
unlockMutex36   void unlock() {
37     if (!locked)
38       double_unlocked = true;
39 
40     locked = false;
41   }
42 };
43 
TEST(LlvmLibcMutexTest,Basic)44 TEST(LlvmLibcMutexTest, Basic) {
45   Mutex m;
46   ASSERT_FALSE(m.locked);
47   ASSERT_FALSE(m.double_locked);
48   ASSERT_FALSE(m.double_unlocked);
49 
50   {
51     lock_guard lg(m);
52     ASSERT_TRUE(m.locked);
53     ASSERT_FALSE(m.double_locked);
54   }
55 
56   ASSERT_FALSE(m.locked);
57   ASSERT_FALSE(m.double_unlocked);
58 }
59 
TEST(LlvmLibcMutexTest,AcquireLocked)60 TEST(LlvmLibcMutexTest, AcquireLocked) {
61   Mutex m;
62   ASSERT_FALSE(m.locked);
63   ASSERT_FALSE(m.double_locked);
64   ASSERT_FALSE(m.double_unlocked);
65 
66   // Lock the mutex before placing a lock guard on it.
67   m.lock();
68   ASSERT_TRUE(m.locked);
69   ASSERT_FALSE(m.double_locked);
70 
71   {
72     lock_guard lg(m, adopt_lock);
73     ASSERT_TRUE(m.locked);
74     ASSERT_FALSE(m.double_locked);
75   }
76 
77   ASSERT_FALSE(m.locked);
78   ASSERT_FALSE(m.double_unlocked);
79 }
80