1*71db0c75SAndroid Build Coastguard Worker //===-- Linux implementation of the pthread_rwlock_init function ----------===// 2*71db0c75SAndroid Build Coastguard Worker // 3*71db0c75SAndroid Build Coastguard Worker // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*71db0c75SAndroid Build Coastguard Worker // See https://llvm.org/LICENSE.txt for license information. 5*71db0c75SAndroid Build Coastguard Worker // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*71db0c75SAndroid Build Coastguard Worker // 7*71db0c75SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 8*71db0c75SAndroid Build Coastguard Worker 9*71db0c75SAndroid Build Coastguard Worker #include "src/pthread/pthread_rwlock_init.h" 10*71db0c75SAndroid Build Coastguard Worker 11*71db0c75SAndroid Build Coastguard Worker #include "src/__support/CPP/new.h" 12*71db0c75SAndroid Build Coastguard Worker #include "src/__support/common.h" 13*71db0c75SAndroid Build Coastguard Worker #include "src/__support/libc_assert.h" 14*71db0c75SAndroid Build Coastguard Worker #include "src/__support/macros/config.h" 15*71db0c75SAndroid Build Coastguard Worker #include "src/__support/threads/linux/rwlock.h" 16*71db0c75SAndroid Build Coastguard Worker 17*71db0c75SAndroid Build Coastguard Worker #include <pthread.h> 18*71db0c75SAndroid Build Coastguard Worker 19*71db0c75SAndroid Build Coastguard Worker namespace LIBC_NAMESPACE_DECL { 20*71db0c75SAndroid Build Coastguard Worker 21*71db0c75SAndroid Build Coastguard Worker static_assert( 22*71db0c75SAndroid Build Coastguard Worker sizeof(RwLock) == sizeof(pthread_rwlock_t) && 23*71db0c75SAndroid Build Coastguard Worker alignof(RwLock) == alignof(pthread_rwlock_t), 24*71db0c75SAndroid Build Coastguard Worker "The public pthread_rwlock_t type must be of the same size and alignment " 25*71db0c75SAndroid Build Coastguard Worker "as the internal rwlock type."); 26*71db0c75SAndroid Build Coastguard Worker 27*71db0c75SAndroid Build Coastguard Worker LLVM_LIBC_FUNCTION(int, pthread_rwlock_init, 28*71db0c75SAndroid Build Coastguard Worker (pthread_rwlock_t * rwlock, 29*71db0c75SAndroid Build Coastguard Worker const pthread_rwlockattr_t *__restrict attr)) { 30*71db0c75SAndroid Build Coastguard Worker pthread_rwlockattr_t rwlockattr{ 31*71db0c75SAndroid Build Coastguard Worker /*pshared=*/PTHREAD_PROCESS_PRIVATE, 32*71db0c75SAndroid Build Coastguard Worker /*pref*/ PTHREAD_RWLOCK_PREFER_READER_NP, 33*71db0c75SAndroid Build Coastguard Worker }; 34*71db0c75SAndroid Build Coastguard Worker // POSIX does not specify this check, so we add an assertion to catch it. 35*71db0c75SAndroid Build Coastguard Worker LIBC_ASSERT(rwlock && "rwlock is null"); 36*71db0c75SAndroid Build Coastguard Worker if (attr) 37*71db0c75SAndroid Build Coastguard Worker rwlockattr = *attr; 38*71db0c75SAndroid Build Coastguard Worker 39*71db0c75SAndroid Build Coastguard Worker // PTHREAD_RWLOCK_PREFER_WRITER_NP is not supported. 40*71db0c75SAndroid Build Coastguard Worker rwlock::Role preference; 41*71db0c75SAndroid Build Coastguard Worker switch (rwlockattr.pref) { 42*71db0c75SAndroid Build Coastguard Worker case PTHREAD_RWLOCK_PREFER_READER_NP: 43*71db0c75SAndroid Build Coastguard Worker preference = rwlock::Role::Reader; 44*71db0c75SAndroid Build Coastguard Worker break; 45*71db0c75SAndroid Build Coastguard Worker case PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP: 46*71db0c75SAndroid Build Coastguard Worker preference = rwlock::Role::Writer; 47*71db0c75SAndroid Build Coastguard Worker break; 48*71db0c75SAndroid Build Coastguard Worker default: 49*71db0c75SAndroid Build Coastguard Worker return EINVAL; 50*71db0c75SAndroid Build Coastguard Worker } 51*71db0c75SAndroid Build Coastguard Worker bool is_pshared; 52*71db0c75SAndroid Build Coastguard Worker switch (rwlockattr.pshared) { 53*71db0c75SAndroid Build Coastguard Worker case PTHREAD_PROCESS_PRIVATE: 54*71db0c75SAndroid Build Coastguard Worker is_pshared = false; 55*71db0c75SAndroid Build Coastguard Worker break; 56*71db0c75SAndroid Build Coastguard Worker case PTHREAD_PROCESS_SHARED: 57*71db0c75SAndroid Build Coastguard Worker is_pshared = true; 58*71db0c75SAndroid Build Coastguard Worker break; 59*71db0c75SAndroid Build Coastguard Worker default: 60*71db0c75SAndroid Build Coastguard Worker return EINVAL; 61*71db0c75SAndroid Build Coastguard Worker } 62*71db0c75SAndroid Build Coastguard Worker 63*71db0c75SAndroid Build Coastguard Worker new (rwlock) RwLock(preference, is_pshared); 64*71db0c75SAndroid Build Coastguard Worker return 0; 65*71db0c75SAndroid Build Coastguard Worker } 66*71db0c75SAndroid Build Coastguard Worker 67*71db0c75SAndroid Build Coastguard Worker } // namespace LIBC_NAMESPACE_DECL 68