| //===-- 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 |