]> git.saurik.com Git - apple/system_cmds.git/blob - kextd.tproj/PTLock.c
92316a54a52f77642f0a4c9b982e219d3c89c2db
[apple/system_cmds.git] / kextd.tproj / PTLock.c
1
2 #include <PTLock.h>
3 #include <stdlib.h>
4 #include <mach/message.h>
5
6 #define mutex_t pthread_mutex_t
7 #define condition_t pthread_cond_t
8
9 #define mutex_init(m) pthread_mutex_init(m, NULL)
10 #define mutex_free(m) pthread_mutex_destroy(m)
11 #define mutex_lock(m) pthread_mutex_lock(m)
12 #define mutex_unlock(m) pthread_mutex_unlock(m)
13
14 #define condition_init(c) pthread_cond_init(c, NULL)
15 #define condition_free(c) pthread_cond_destroy(c)
16 #define condition_wait(c, m) pthread_cond_wait(c, m)
17 #define condition_signal(c) pthread_cond_signal(c)
18 #define condition_broadcast(c) pthread_cond_broadcast(c)
19
20
21 typedef struct _PTLock {
22 Boolean locked;
23 pthread_mutex_t m;
24 pthread_cond_t c;
25 } PTLock;
26
27
28 PTLockRef
29 PTLockCreate(void)
30 {
31 PTLock * l;
32
33 l = (PTLock *)malloc(sizeof(PTLock));
34 if ( !l )
35 return NULL;
36
37 l->locked = false;
38 mutex_init(&l->m);
39 condition_init(&l->c);
40
41 return (PTLockRef)l;
42 }
43
44 void
45 PTLockFree(PTLockRef lock)
46 {
47 PTLock * l = (PTLock *)lock;
48
49 if ( !lock )
50 return;
51
52 mutex_free(&l->m);
53 condition_free(&l->c);
54 free(lock);
55 }
56
57 void
58 PTLockTakeLock(PTLockRef lock)
59 {
60 PTLock * l = (PTLock *)lock;
61
62 mutex_lock(&l->m);
63 while ( l->locked )
64 condition_wait(&l->c, &l->m);
65 l->locked = true;
66 mutex_unlock(&l->m);
67 }
68
69 void
70 PTLockUnlock(PTLockRef lock)
71 {
72 PTLock * l = (PTLock *)lock;
73
74 mutex_lock(&l->m);
75 l->locked = false;
76 condition_signal(&l->c);
77 mutex_unlock(&l->m);
78 }
79
80 Boolean
81 PTLockTryLock(PTLockRef lock)
82 {
83 PTLock * l = (PTLock *)lock;
84
85 Boolean ret;
86
87 mutex_lock(&l->m);
88 ret = !l->locked;
89 if ( ret )
90 l->locked = true;
91 mutex_unlock(&l->m);
92
93 return ret;
94 }
95