blob: a68c84cfc78af143ac6fd80d84f77f866bf6a420 [file] [log] [blame]
//===-- 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);
}