pthread_mutexattr_setprotocol.c raw

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