55 lines · 873 B · C
RawDownload
#include <u.h>#include <unistd.h>#include <sys/time.h>#include <sched.h>#include <errno.h>#include <libc.h> static pthread_mutex_t initmutex = PTHREAD_MUTEX_INITIALIZER; static voidlockinit(Lock *lk){	pthread_mutexattr_t attr; 	pthread_mutex_lock(&initmutex);	if(lk->init == 0){		pthread_mutexattr_init(&attr);		pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_NORMAL);		pthread_mutex_init(&lk->mutex, &attr);		pthread_mutexattr_destroy(&attr);		lk->init = 1;	}	pthread_mutex_unlock(&initmutex);} voidlock(Lock *lk){	if(!lk->init)		lockinit(lk);	if(pthread_mutex_lock(&lk->mutex) != 0)		abort();} intcanlock(Lock *lk){	int r; 	if(!lk->init)		lockinit(lk);	r = pthread_mutex_trylock(&lk->mutex);	if(r == 0)		return 1;	if(r == EBUSY)		return 0;	abort();} voidunlock(Lock *lk){	if(pthread_mutex_unlock(&lk->mutex) != 0)		abort();}