diff options
| author | Koakuma <koachan@protonmail.com> | 2024-07-08 19:19:54 +0700 |
|---|---|---|
| committer | Koakuma <koachan@protonmail.com> | 2024-07-08 19:19:54 +0700 |
| commit | 5c4fdc2fd5898ebd9e89999a4f4b8aa289ca637f (patch) | |
| tree | f3b92a07f3dfc6e70f36d1000605f36a3c15af46 /libc/src/pthread/pthread_rwlock_timedrdlock.cpp | |
| parent | dbda8e2f2cd8764e0badd983915d62a2c3377f4d (diff) | |
| parent | e9b8cd0c806db00f0981fb36717077c941426302 (diff) | |
[𝘀𝗽𝗿] changes introduced through rebaseusers/koachan/spr/main.sparcias-enable-parseforallfeatures-in-matchoperandparserimpl
Created using spr 1.3.5
[skip ci]
Diffstat (limited to 'libc/src/pthread/pthread_rwlock_timedrdlock.cpp')
| -rw-r--r-- | libc/src/pthread/pthread_rwlock_timedrdlock.cpp | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/libc/src/pthread/pthread_rwlock_timedrdlock.cpp b/libc/src/pthread/pthread_rwlock_timedrdlock.cpp new file mode 100644 index 000000000000..6ce69ea738a9 --- /dev/null +++ b/libc/src/pthread/pthread_rwlock_timedrdlock.cpp @@ -0,0 +1,49 @@ +//===-- Implementation of the Rwlock's timedrdlock function ---------------===// +// +// 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/pthread/pthread_rwlock_timedrdlock.h" + +#include "src/__support/common.h" +#include "src/__support/libc_assert.h" +#include "src/__support/macros/optimization.h" +#include "src/__support/threads/linux/rwlock.h" +#include "src/__support/time/linux/abs_timeout.h" + +#include <errno.h> +#include <pthread.h> + +namespace LIBC_NAMESPACE { + +static_assert( + sizeof(RwLock) == sizeof(pthread_rwlock_t) && + alignof(RwLock) == alignof(pthread_rwlock_t), + "The public pthread_rwlock_t type must be of the same size and alignment " + "as the internal rwlock type."); + +LLVM_LIBC_FUNCTION(int, pthread_rwlock_timedrdlock, + (pthread_rwlock_t * rwlock, + const struct timespec *abstime)) { + if (!rwlock) + return EINVAL; + RwLock *rw = reinterpret_cast<RwLock *>(rwlock); + LIBC_ASSERT(abstime && "timedrdlock called with a null timeout"); + auto timeout = + internal::AbsTimeout::from_timespec(*abstime, /*is_realtime=*/true); + if (LIBC_LIKELY(timeout.has_value())) + return static_cast<int>(rw->read_lock(timeout.value())); + + switch (timeout.error()) { + case internal::AbsTimeout::Error::Invalid: + return EINVAL; + case internal::AbsTimeout::Error::BeforeEpoch: + return ETIMEDOUT; + } + __builtin_unreachable(); +} + +} // namespace LIBC_NAMESPACE |
