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
12using LIBC_NAMESPACE::cpp::adopt_lock;
13using 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.
17struct 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
27 Mutex() {}
28
29 void lock() {
30 if (locked)
31 double_locked = true;
32
33 locked = true;
34 }
35
36 void unlock() {
37 if (!locked)
38 double_unlocked = true;
39
40 locked = false;
41 }
42};
43
44TEST(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
60TEST(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

source code of libc/test/src/__support/CPP/mutex_test.cpp