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 
check_pi()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 
pthread_mutexattr_setprotocol(pthread_mutexattr_t * a,int protocol)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 }
30