lock.c - 9base - revived minimalist port of Plan 9 userland to Unix
(HTM) git clone git://git.suckless.org/9base
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
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 }