| #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 void |
| lockinit(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); |
| } |
| |
| void |
| lock(Lock *lk) |
| { |
| if(!lk->init) |
| lockinit(lk); |
| if(pthread_mutex_lock(&lk->mutex) != 0) |
| abort(); |
| } |
| |
| int |
| canlock(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(); |
| } |
| |
| void |
| unlock(Lock *lk) |
| { |
| if(pthread_mutex_unlock(&lk->mutex) != 0) |
| abort(); |
| } |