Blob


1 #include <u.h>
2 #include <libc.h>
4 /*
5 * The function pointers are supplied by the thread
6 * library during its initialization. If there is no thread
7 * library, there is no multithreading.
8 */
10 int (*_lock)(Lock*, int, ulong);
11 void (*_unlock)(Lock*, ulong);
12 int (*_qlock)(QLock*, int, ulong); /* do not use */
13 void (*_qunlock)(QLock*, ulong);
14 void (*_rsleep)(Rendez*, ulong); /* do not use */
15 int (*_rwakeup)(Rendez*, int, ulong);
16 int (*_rlock)(RWLock*, int, ulong); /* do not use */
17 int (*_wlock)(RWLock*, int, ulong);
18 void (*_runlock)(RWLock*, ulong);
19 void (*_wunlock)(RWLock*, ulong);
21 void
22 lock(Lock *l)
23 {
24 if(_lock)
25 (*_lock)(l, 1, getcallerpc(&l));
26 else
27 l->held = 1;
28 }
30 int
31 canlock(Lock *l)
32 {
33 if(_lock)
34 return (*_lock)(l, 0, getcallerpc(&l));
35 else{
36 if(l->held)
37 return 0;
38 l->held = 1;
39 return 1;
40 }
41 }
43 void
44 unlock(Lock *l)
45 {
46 if(_unlock)
47 (*_unlock)(l, getcallerpc(&l));
48 else
49 l->held = 0;
50 }
52 void
53 qlock(QLock *l)
54 {
55 if(_qlock)
56 (*_qlock)(l, 1, getcallerpc(&l));
57 else
58 l->l.held = 1;
59 }
61 int
62 canqlock(QLock *l)
63 {
64 if(_qlock)
65 return (*_qlock)(l, 0, getcallerpc(&l));
66 else{
67 if(l->l.held)
68 return 0;
69 l->l.held = 1;
70 return 1;
71 }
72 }
74 void
75 qunlock(QLock *l)
76 {
77 if(_qunlock)
78 (*_qunlock)(l, getcallerpc(&l));
79 else
80 l->l.held = 0;
81 }
83 void
84 rlock(RWLock *l)
85 {
86 if(_rlock)
87 (*_rlock)(l, 1, getcallerpc(&l));
88 else
89 l->readers++;
90 }
92 int
93 canrlock(RWLock *l)
94 {
95 if(_rlock)
96 return (*_rlock)(l, 0, getcallerpc(&l));
97 else{
98 if(l->writer)
99 return 0;
100 l->readers++;
101 return 1;
103 return 1;
106 void
107 runlock(RWLock *l)
109 if(_runlock)
110 (*_runlock)(l, getcallerpc(&l));
111 else
112 l->readers--;
115 void
116 wlock(RWLock *l)
118 if(_wlock)
119 (*_wlock)(l, 1, getcallerpc(&l));
120 else
121 l->writer = (void*)1;
124 int
125 canwlock(RWLock *l)
127 if(_wlock)
128 return (*_wlock)(l, 0, getcallerpc(&l));
129 else{
130 if(l->writer || l->readers)
131 return 0;
132 l->writer = (void*)1;
133 return 1;
137 void
138 wunlock(RWLock *l)
140 if(_wunlock)
141 (*_wunlock)(l, getcallerpc(&l));
142 else
143 l->writer = nil;
146 void
147 rsleep(Rendez *r)
149 if(_rsleep)
150 (*_rsleep)(r, getcallerpc(&r));
153 int
154 rwakeup(Rendez *r)
156 if(_rwakeup)
157 return (*_rwakeup)(r, 0, getcallerpc(&r));
158 return 0;
161 int
162 rwakeupall(Rendez *r)
164 if(_rwakeup)
165 return (*_rwakeup)(r, 1, getcallerpc(&r));
166 return 0;