implement priority inheritance mutexes
[musl] / src / thread / pthread_mutexattr_setprotocol.c
1 #include "pthread_impl.h"
2 #include "syscall.h"
3
4 static pthread_once_t check_pi_once;
5 static int check_pi_result;
6
7 static void check_pi()
8 {
9         volatile int lk = 0;
10         check_pi_result = -__syscall(SYS_futex, &lk, FUTEX_LOCK_PI, 0, 0);
11 }
12
13 int pthread_mutexattr_setprotocol(pthread_mutexattr_t *a, int protocol)
14 {
15         switch (protocol) {
16         case PTHREAD_PRIO_NONE:
17                 a->__attr &= ~8;
18                 return 0;
19         case PTHREAD_PRIO_INHERIT:
20                 pthread_once(&check_pi_once, check_pi);
21                 if (check_pi_result) return check_pi_result;
22                 a->__attr |= 8;
23                 return 0;
24         case PTHREAD_PRIO_PROTECT:
25                 return ENOTSUP;
26         default:
27                 return EINVAL;
28         }
29 }