#include "src/__support/CPP/mutex.h"
#include "test/UnitTest/Test.h"
using LIBC_NAMESPACE::cpp::adopt_lock;
using LIBC_NAMESPACE::cpp::lock_guard;
struct Mutex {
bool locked = false;
bool double_locked = false;
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);
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);
}