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

     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  }