github.com/afumu/libc@v0.0.6/musl/src/thread/pthread_mutexattr_setprotocol.c (about)

     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  }