1*2a5d5078SSiva Chandra Reddy //===-- Linux implementation of the pthread_mutex_init function -----------===//
2*2a5d5078SSiva Chandra Reddy //
3*2a5d5078SSiva Chandra Reddy // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*2a5d5078SSiva Chandra Reddy // See https://llvm.org/LICENSE.txt for license information.
5*2a5d5078SSiva Chandra Reddy // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*2a5d5078SSiva Chandra Reddy //
7*2a5d5078SSiva Chandra Reddy //===----------------------------------------------------------------------===//
8*2a5d5078SSiva Chandra Reddy 
9*2a5d5078SSiva Chandra Reddy #include "pthread_mutex_init.h"
10*2a5d5078SSiva Chandra Reddy #include "pthread_mutexattr.h"
11*2a5d5078SSiva Chandra Reddy 
12*2a5d5078SSiva Chandra Reddy #include "src/__support/common.h"
13*2a5d5078SSiva Chandra Reddy #include "src/__support/threads/mutex.h"
14*2a5d5078SSiva Chandra Reddy 
15*2a5d5078SSiva Chandra Reddy #include <errno.h>
16*2a5d5078SSiva Chandra Reddy #include <pthread.h>
17*2a5d5078SSiva Chandra Reddy 
18*2a5d5078SSiva Chandra Reddy namespace __llvm_libc {
19*2a5d5078SSiva Chandra Reddy 
20*2a5d5078SSiva Chandra Reddy static_assert(sizeof(Mutex) <= sizeof(pthread_mutex_t),
21*2a5d5078SSiva Chandra Reddy               "The public pthread_mutex_t type cannot accommodate the internal "
22*2a5d5078SSiva Chandra Reddy               "mutex type.");
23*2a5d5078SSiva Chandra Reddy 
24*2a5d5078SSiva Chandra Reddy LLVM_LIBC_FUNCTION(int, pthread_mutex_init,
25*2a5d5078SSiva Chandra Reddy                    (pthread_mutex_t * m,
26*2a5d5078SSiva Chandra Reddy                     const pthread_mutexattr_t *__restrict attr)) {
27*2a5d5078SSiva Chandra Reddy   auto mutexattr = attr == nullptr ? DEFAULT_MUTEXATTR : *attr;
28*2a5d5078SSiva Chandra Reddy   auto err =
29*2a5d5078SSiva Chandra Reddy       Mutex::init(reinterpret_cast<Mutex *>(m), false,
30*2a5d5078SSiva Chandra Reddy                   get_mutexattr_type(mutexattr) & PTHREAD_MUTEX_RECURSIVE,
31*2a5d5078SSiva Chandra Reddy                   get_mutexattr_robust(mutexattr) & PTHREAD_MUTEX_ROBUST);
32*2a5d5078SSiva Chandra Reddy   return err == MutexError::NONE ? 0 : EAGAIN;
33*2a5d5078SSiva Chandra Reddy }
34*2a5d5078SSiva Chandra Reddy 
35*2a5d5078SSiva Chandra Reddy } // namespace __llvm_libc
36