• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===-- Declarations related mutex attribute objects  -----------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #ifndef LLVM_LIBC_SRC_PTHREAD_PTHREAD_MUTEXATTR_H
10 #define LLVM_LIBC_SRC_PTHREAD_PTHREAD_MUTEXATTR_H
11 
12 #include "src/__support/common.h"
13 
14 #include <pthread.h>
15 
16 namespace LIBC_NAMESPACE {
17 
18 enum class PThreadMutexAttrPos : unsigned int {
19   TYPE_SHIFT = 0,
20   TYPE_MASK = 0x3 << TYPE_SHIFT, // Type is encoded in 2 bits
21 
22   ROBUST_SHIFT = 2,
23   ROBUST_MASK = 0x1 << ROBUST_SHIFT,
24 
25   PSHARED_SHIFT = 3,
26   PSHARED_MASK = 0x1 << PSHARED_SHIFT,
27 
28   // TODO: Add a mask for protocol and prioceiling when it is supported.
29 };
30 
31 constexpr pthread_mutexattr_t DEFAULT_MUTEXATTR =
32     PTHREAD_MUTEX_DEFAULT << unsigned(PThreadMutexAttrPos::TYPE_SHIFT) |
33     PTHREAD_MUTEX_STALLED << unsigned(PThreadMutexAttrPos::ROBUST_SHIFT) |
34     PTHREAD_PROCESS_PRIVATE << unsigned(PThreadMutexAttrPos::PSHARED_SHIFT);
35 
get_mutexattr_type(pthread_mutexattr_t attr)36 LIBC_INLINE int get_mutexattr_type(pthread_mutexattr_t attr) {
37   return (attr & unsigned(PThreadMutexAttrPos::TYPE_MASK)) >>
38          unsigned(PThreadMutexAttrPos::TYPE_SHIFT);
39 }
40 
get_mutexattr_robust(pthread_mutexattr_t attr)41 LIBC_INLINE int get_mutexattr_robust(pthread_mutexattr_t attr) {
42   return (attr & unsigned(PThreadMutexAttrPos::ROBUST_MASK)) >>
43          unsigned(PThreadMutexAttrPos::ROBUST_SHIFT);
44 }
45 
get_mutexattr_pshared(pthread_mutexattr_t attr)46 LIBC_INLINE int get_mutexattr_pshared(pthread_mutexattr_t attr) {
47   return (attr & unsigned(PThreadMutexAttrPos::PSHARED_MASK)) >>
48          unsigned(PThreadMutexAttrPos::PSHARED_SHIFT);
49 }
50 
51 } // namespace LIBC_NAMESPACE
52 
53 #endif // LLVM_LIBC_SRC_PTHREAD_PTHREAD_MUTEXATTR_H
54