Blame


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