diff options
| author | Arthur Eubanks <aeubanks@google.com> | 2024-06-27 16:32:27 -0700 |
|---|---|---|
| committer | shawbyoung <shawbyoung@gmail.com> | 2024-06-27 16:32:27 -0700 |
| commit | f5c7df12cacdb84552b36a7ac598a8db41acc680 (patch) | |
| tree | 3b33e941b9bfb88c40c64fd18ee32a633423cbed /libc/src/pthread/pthread_rwlock_init.cpp | |
| parent | 608880c3a7a59c86db82728067e553a8d4665a45 (diff) | |
| parent | 804415825b97e974c96a92580bcbeaf4c7ff0a04 (diff) | |
[𝘀𝗽𝗿] changes introduced through rebaseusers/shawbyoung/spr/main.boltnfc-refactoring-callgraph
Created using spr 1.3.4
[skip ci]
Diffstat (limited to 'libc/src/pthread/pthread_rwlock_init.cpp')
| -rw-r--r-- | libc/src/pthread/pthread_rwlock_init.cpp | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/libc/src/pthread/pthread_rwlock_init.cpp b/libc/src/pthread/pthread_rwlock_init.cpp new file mode 100644 index 000000000000..b1b58aac6c6f --- /dev/null +++ b/libc/src/pthread/pthread_rwlock_init.cpp @@ -0,0 +1,67 @@ +//===-- Linux implementation of the pthread_rwlock_init 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_init.h" + +#include "src/__support/CPP/new.h" +#include "src/__support/common.h" +#include "src/__support/libc_assert.h" +#include "src/__support/threads/linux/rwlock.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_init, + (pthread_rwlock_t * rwlock, + const pthread_rwlockattr_t *__restrict attr)) { + pthread_rwlockattr_t rwlockattr{ + /*pshared=*/PTHREAD_PROCESS_PRIVATE, + /*pref*/ PTHREAD_RWLOCK_PREFER_READER_NP, + }; + // POSIX does not specify this check, so we add an assertion to catch it. + LIBC_ASSERT(rwlock && "rwlock is null"); + if (attr) + rwlockattr = *attr; + + // PTHREAD_RWLOCK_PREFER_WRITER_NP is not supported. + rwlock::Role preference; + switch (rwlockattr.pref) { + case PTHREAD_RWLOCK_PREFER_READER_NP: + preference = rwlock::Role::Reader; + break; + case PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP: + preference = rwlock::Role::Writer; + break; + default: + return EINVAL; + } + bool is_pshared; + switch (rwlockattr.pshared) { + case PTHREAD_PROCESS_PRIVATE: + is_pshared = false; + break; + case PTHREAD_PROCESS_SHARED: + is_pshared = true; + break; + default: + return EINVAL; + } + + new (rwlock) RwLock(preference, is_pshared); + return 0; +} + +} // namespace LIBC_NAMESPACE |
