#include "pthread_impl.h" | |
#include "syscall.h" | |
static volatile int check_pi_result = -1; | |
int pthread_mutexattr_setprotocol(pthread_mutexattr_t *a, int protocol) | |
{ | |
int r; | |
switch (protocol) { | |
case PTHREAD_PRIO_NONE: | |
a->__attr &= ~8; | |
return 0; | |
case PTHREAD_PRIO_INHERIT: | |
r = check_pi_result; | |
if (r < 0) { | |
volatile int lk = 0; | |
r = -__syscall(SYS_futex, &lk, FUTEX_LOCK_PI, 0, 0); | |
a_store(&check_pi_result, r); | |
} | |
if (r) return r; | |
a->__attr |= 8; | |
return 0; | |
case PTHREAD_PRIO_PROTECT: | |
return ENOTSUP; | |
default: | |
return EINVAL; | |
} | |
} |