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;
105 void
106 runlock(RWLock *l)
108 if(_runlock)
109 (*_runlock)(l, getcallerpc(&l));
110 else
111 l->readers--;
114 void
115 wlock(RWLock *l)
117 if(_wlock)
118 (*_wlock)(l, 1, getcallerpc(&l));
119 else
120 l->writer = (void*)1;
123 int
124 canwlock(RWLock *l)
126 if(_wlock)
127 return (*_wlock)(l, 0, getcallerpc(&l));
128 else{
129 if(l->writer || l->readers)
130 return 0;
131 l->writer = (void*)1;
132 return 1;
136 void
137 wunlock(RWLock *l)
139 if(_wunlock)
140 (*_wunlock)(l, getcallerpc(&l));
141 else
142 l->writer = nil;
145 void
146 rsleep(Rendez *r)
148 if(_rsleep)
149 (*_rsleep)(r, getcallerpc(&r));
152 int
153 rwakeup(Rendez *r)
155 if(_rwakeup)
156 return (*_rwakeup)(r, 0, getcallerpc(&r));
157 return 0;
160 int
161 rwakeupall(Rendez *r)
163 if(_rwakeup)
164 return (*_rwakeup)(r, 1, getcallerpc(&r));
165 return 0;