xref: /llvm-project/libc/src/pthread/pthread_rwlock_init.cpp (revision 46944b0cbc9a9d8daad0182c40fcd3560bc9ca35)
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