lock.c (873B)
1 #include <u.h> 2 #include <unistd.h> 3 #include <sys/time.h> 4 #include <sched.h> 5 #include <errno.h> 6 #include <libc.h> 7 8 static pthread_mutex_t initmutex = PTHREAD_MUTEX_INITIALIZER; 9 10 static void 11 lockinit(Lock *lk) 12 { 13 pthread_mutexattr_t attr; 14 15 pthread_mutex_lock(&initmutex); 16 if(lk->init == 0){ 17 pthread_mutexattr_init(&attr); 18 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_NORMAL); 19 pthread_mutex_init(&lk->mutex, &attr); 20 pthread_mutexattr_destroy(&attr); 21 lk->init = 1; 22 } 23 pthread_mutex_unlock(&initmutex); 24 } 25 26 void 27 lock(Lock *lk) 28 { 29 if(!lk->init) 30 lockinit(lk); 31 if(pthread_mutex_lock(&lk->mutex) != 0) 32 abort(); 33 } 34 35 int 36 canlock(Lock *lk) 37 { 38 int r; 39 40 if(!lk->init) 41 lockinit(lk); 42 r = pthread_mutex_trylock(&lk->mutex); 43 if(r == 0) 44 return 1; 45 if(r == EBUSY) 46 return 0; 47 abort(); 48 } 49 50 void 51 unlock(Lock *lk) 52 { 53 if(pthread_mutex_unlock(&lk->mutex) != 0) 54 abort(); 55 }