141fecca9SSchrodinger ZHU Yifan //===-- Linux implementation of the pthread_rwlock_init function ----------===// 241fecca9SSchrodinger ZHU Yifan // 341fecca9SSchrodinger ZHU Yifan // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 441fecca9SSchrodinger ZHU Yifan // See https://llvm.org/LICENSE.txt for license information. 541fecca9SSchrodinger ZHU Yifan // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 641fecca9SSchrodinger ZHU Yifan // 741fecca9SSchrodinger ZHU Yifan //===----------------------------------------------------------------------===// 841fecca9SSchrodinger ZHU Yifan 941fecca9SSchrodinger ZHU Yifan #include "src/pthread/pthread_rwlock_init.h" 1041fecca9SSchrodinger ZHU Yifan 1141fecca9SSchrodinger ZHU Yifan #include "src/__support/CPP/new.h" 1241fecca9SSchrodinger ZHU Yifan #include "src/__support/common.h" 1341fecca9SSchrodinger ZHU Yifan #include "src/__support/libc_assert.h" 14*5ff3ff33SPetr Hosek #include "src/__support/macros/config.h" 1541fecca9SSchrodinger ZHU Yifan #include "src/__support/threads/linux/rwlock.h" 1641fecca9SSchrodinger ZHU Yifan 1741fecca9SSchrodinger ZHU Yifan #include <pthread.h> 1841fecca9SSchrodinger ZHU Yifan 19*5ff3ff33SPetr Hosek namespace LIBC_NAMESPACE_DECL { 2041fecca9SSchrodinger ZHU Yifan 2141fecca9SSchrodinger ZHU Yifan static_assert( 2241fecca9SSchrodinger ZHU Yifan sizeof(RwLock) == sizeof(pthread_rwlock_t) && 2341fecca9SSchrodinger ZHU Yifan alignof(RwLock) == alignof(pthread_rwlock_t), 2441fecca9SSchrodinger ZHU Yifan "The public pthread_rwlock_t type must be of the same size and alignment " 2541fecca9SSchrodinger ZHU Yifan "as the internal rwlock type."); 2641fecca9SSchrodinger ZHU Yifan 2741fecca9SSchrodinger ZHU Yifan LLVM_LIBC_FUNCTION(int, pthread_rwlock_init, 2841fecca9SSchrodinger ZHU Yifan (pthread_rwlock_t * rwlock, 2941fecca9SSchrodinger ZHU Yifan const pthread_rwlockattr_t *__restrict attr)) { 3041fecca9SSchrodinger ZHU Yifan pthread_rwlockattr_t rwlockattr{ 3141fecca9SSchrodinger ZHU Yifan /*pshared=*/PTHREAD_PROCESS_PRIVATE, 3241fecca9SSchrodinger ZHU Yifan /*pref*/ PTHREAD_RWLOCK_PREFER_READER_NP, 3341fecca9SSchrodinger ZHU Yifan }; 3441fecca9SSchrodinger ZHU Yifan // POSIX does not specify this check, so we add an assertion to catch it. 3541fecca9SSchrodinger ZHU Yifan LIBC_ASSERT(rwlock && "rwlock is null"); 3641fecca9SSchrodinger ZHU Yifan if (attr) 3741fecca9SSchrodinger ZHU Yifan rwlockattr = *attr; 3841fecca9SSchrodinger ZHU Yifan 3941fecca9SSchrodinger ZHU Yifan // PTHREAD_RWLOCK_PREFER_WRITER_NP is not supported. 4041fecca9SSchrodinger ZHU Yifan rwlock::Role preference; 4141fecca9SSchrodinger ZHU Yifan switch (rwlockattr.pref) { 4241fecca9SSchrodinger ZHU Yifan case PTHREAD_RWLOCK_PREFER_READER_NP: 4341fecca9SSchrodinger ZHU Yifan preference = rwlock::Role::Reader; 4441fecca9SSchrodinger ZHU Yifan break; 4541fecca9SSchrodinger ZHU Yifan case PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP: 4641fecca9SSchrodinger ZHU Yifan preference = rwlock::Role::Writer; 4741fecca9SSchrodinger ZHU Yifan break; 4841fecca9SSchrodinger ZHU Yifan default: 4941fecca9SSchrodinger ZHU Yifan return EINVAL; 5041fecca9SSchrodinger ZHU Yifan } 5141fecca9SSchrodinger ZHU Yifan bool is_pshared; 5241fecca9SSchrodinger ZHU Yifan switch (rwlockattr.pshared) { 5341fecca9SSchrodinger ZHU Yifan case PTHREAD_PROCESS_PRIVATE: 5441fecca9SSchrodinger ZHU Yifan is_pshared = false; 5541fecca9SSchrodinger ZHU Yifan break; 5641fecca9SSchrodinger ZHU Yifan case PTHREAD_PROCESS_SHARED: 5741fecca9SSchrodinger ZHU Yifan is_pshared = true; 5841fecca9SSchrodinger ZHU Yifan break; 5941fecca9SSchrodinger ZHU Yifan default: 6041fecca9SSchrodinger ZHU Yifan return EINVAL; 6141fecca9SSchrodinger ZHU Yifan } 6241fecca9SSchrodinger ZHU Yifan 6341fecca9SSchrodinger ZHU Yifan new (rwlock) RwLock(preference, is_pshared); 6441fecca9SSchrodinger ZHU Yifan return 0; 6541fecca9SSchrodinger ZHU Yifan } 6641fecca9SSchrodinger ZHU Yifan 67*5ff3ff33SPetr Hosek } // namespace LIBC_NAMESPACE_DECL 68