blob: a9df97bc94ebb634ffdd3a14caa0e4db90bd8cbd [file] [log] [blame]
//===-- Unittests for Darwin's 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/threads/mutex.h"
#include "src/__support/threads/mutex_common.h"
#include "src/__support/threads/raw_mutex.h"
#include "test/UnitTest/Test.h"
TEST(LlvmLibcSupportThreadsMutexTest, SmokeTest) {
LIBC_NAMESPACE::Mutex mutex(0, 0, 0, 0);
ASSERT_EQ(mutex.lock(), LIBC_NAMESPACE::MutexError::NONE);
ASSERT_EQ(mutex.unlock(), LIBC_NAMESPACE::MutexError::NONE);
ASSERT_EQ(mutex.try_lock(), LIBC_NAMESPACE::MutexError::NONE);
ASSERT_EQ(mutex.try_lock(), LIBC_NAMESPACE::MutexError::BUSY);
ASSERT_EQ(mutex.unlock(), LIBC_NAMESPACE::MutexError::NONE);
ASSERT_EQ(mutex.unlock(), LIBC_NAMESPACE::MutexError::UNLOCK_WITHOUT_LOCK);
}
TEST(LlvmLibcSupportThreadsRawMutexTest, Timeout) {
LIBC_NAMESPACE::RawMutex mutex;
ASSERT_TRUE(mutex.lock());
timespec ts;
LIBC_NAMESPACE::internal::clock_gettime(CLOCK_MONOTONIC, &ts);
ts.tv_sec += 1;
// Timeout will be respected when deadlock happens.
auto timeout = LIBC_NAMESPACE::internal::AbsTimeout::from_timespec(ts, false);
ASSERT_TRUE(timeout.has_value());
// The following will timeout
ASSERT_FALSE(mutex.lock(*timeout));
ASSERT_TRUE(mutex.unlock());
// Test that the mutex works after the timeout.
ASSERT_TRUE(mutex.lock());
ASSERT_TRUE(mutex.unlock());
// If a lock can be acquired directly, expired timeout will not count.
// Notice that the timeout is already reached during preivous deadlock.
ASSERT_TRUE(mutex.lock(*timeout));
ASSERT_TRUE(mutex.unlock());
}
// TODO(bojle): merge threads test for darwin and linux into one after
// adding support for shared locks in darwin