Blame


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