sem_trywait.c raw

   1  #include <semaphore.h>
   2  #include "pthread_impl.h"
   3  
   4  int sem_trywait(sem_t *sem)
   5  {
   6  	int val;
   7  	while ((val=sem->__val[0]) > 0) {
   8  		int new = val-1-(val==1 && sem->__val[1]);
   9  		if (a_cas(sem->__val, val, new)==val) return 0;
  10  	}
  11  	errno = EAGAIN;
  12  	return -1;
  13  }
  14