xref: /aosp_15_r20/external/musl/src/thread/pthread_mutexattr_setprotocol.c (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
1*c9945492SAndroid Build Coastguard Worker #include "pthread_impl.h"
2*c9945492SAndroid Build Coastguard Worker #include "syscall.h"
3*c9945492SAndroid Build Coastguard Worker 
4*c9945492SAndroid Build Coastguard Worker static volatile int check_pi_result = -1;
5*c9945492SAndroid Build Coastguard Worker 
pthread_mutexattr_setprotocol(pthread_mutexattr_t * a,int protocol)6*c9945492SAndroid Build Coastguard Worker int pthread_mutexattr_setprotocol(pthread_mutexattr_t *a, int protocol)
7*c9945492SAndroid Build Coastguard Worker {
8*c9945492SAndroid Build Coastguard Worker 	int r;
9*c9945492SAndroid Build Coastguard Worker 	switch (protocol) {
10*c9945492SAndroid Build Coastguard Worker 	case PTHREAD_PRIO_NONE:
11*c9945492SAndroid Build Coastguard Worker 		a->__attr &= ~8;
12*c9945492SAndroid Build Coastguard Worker 		return 0;
13*c9945492SAndroid Build Coastguard Worker 	case PTHREAD_PRIO_INHERIT:
14*c9945492SAndroid Build Coastguard Worker 		r = check_pi_result;
15*c9945492SAndroid Build Coastguard Worker 		if (r < 0) {
16*c9945492SAndroid Build Coastguard Worker 			volatile int lk = 0;
17*c9945492SAndroid Build Coastguard Worker 			r = -__syscall(SYS_futex, &lk, FUTEX_LOCK_PI, 0, 0);
18*c9945492SAndroid Build Coastguard Worker 			a_store(&check_pi_result, r);
19*c9945492SAndroid Build Coastguard Worker 		}
20*c9945492SAndroid Build Coastguard Worker 		if (r) return r;
21*c9945492SAndroid Build Coastguard Worker 		a->__attr |= 8;
22*c9945492SAndroid Build Coastguard Worker 		return 0;
23*c9945492SAndroid Build Coastguard Worker 	case PTHREAD_PRIO_PROTECT:
24*c9945492SAndroid Build Coastguard Worker 		return ENOTSUP;
25*c9945492SAndroid Build Coastguard Worker 	default:
26*c9945492SAndroid Build Coastguard Worker 		return EINVAL;
27*c9945492SAndroid Build Coastguard Worker 	}
28*c9945492SAndroid Build Coastguard Worker }
29