blob: 7d9d064a069b8c3815c9e681d2f4f4b6e80c2f31 [file] [log] [blame]
rsc5f8fa942004-12-26 21:51:15 +00001#include <u.h>
2#include <libc.h>
rscb2cfc4e2003-09-30 17:47:41 +00003
rsc5f8fa942004-12-26 21:51:15 +00004/*
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 */
rscb2cfc4e2003-09-30 17:47:41 +00009
rsc5f8fa942004-12-26 21:51:15 +000010int (*_lock)(Lock*, int, ulong);
11void (*_unlock)(Lock*, ulong);
12int (*_qlock)(QLock*, int, ulong); /* do not use */
13void (*_qunlock)(QLock*, ulong);
14void (*_rsleep)(Rendez*, ulong); /* do not use */
15int (*_rwakeup)(Rendez*, int, ulong);
16int (*_rlock)(RWLock*, int, ulong); /* do not use */
17int (*_wlock)(RWLock*, int, ulong);
18void (*_runlock)(RWLock*, ulong);
19void (*_wunlock)(RWLock*, ulong);
rscb2cfc4e2003-09-30 17:47:41 +000020
21void
rsc5f8fa942004-12-26 21:51:15 +000022lock(Lock *l)
rscb2cfc4e2003-09-30 17:47:41 +000023{
rsc5f8fa942004-12-26 21:51:15 +000024 if(_lock)
25 (*_lock)(l, 1, getcallerpc(&l));
rscb2cfc4e2003-09-30 17:47:41 +000026 else
rsc5f8fa942004-12-26 21:51:15 +000027 l->held = 1;
rscb2cfc4e2003-09-30 17:47:41 +000028}
29
30int
rsc5f8fa942004-12-26 21:51:15 +000031canlock(Lock *l)
rscb2cfc4e2003-09-30 17:47:41 +000032{
rsc5f8fa942004-12-26 21:51:15 +000033 if(_lock)
34 return (*_lock)(l, 0, getcallerpc(&l));
35 else{
36 if(l->held)
37 return 0;
38 l->held = 1;
rscb2cfc4e2003-09-30 17:47:41 +000039 return 1;
40 }
rscb2cfc4e2003-09-30 17:47:41 +000041}
42
43void
rsc5f8fa942004-12-26 21:51:15 +000044unlock(Lock *l)
rscb2cfc4e2003-09-30 17:47:41 +000045{
rsc5f8fa942004-12-26 21:51:15 +000046 if(_unlock)
47 (*_unlock)(l, getcallerpc(&l));
rscb2cfc4e2003-09-30 17:47:41 +000048 else
rsc5f8fa942004-12-26 21:51:15 +000049 l->held = 0;
50}
51
52void
53qlock(QLock *l)
54{
55 if(_qlock)
56 (*_qlock)(l, 1, getcallerpc(&l));
57 else
58 l->l.held = 1;
rscb2cfc4e2003-09-30 17:47:41 +000059}
60
61int
rsc5f8fa942004-12-26 21:51:15 +000062canqlock(QLock *l)
rscb2cfc4e2003-09-30 17:47:41 +000063{
rsc5f8fa942004-12-26 21:51:15 +000064 if(_qlock)
65 return (*_qlock)(l, 0, getcallerpc(&l));
66 else{
67 if(l->l.held)
68 return 0;
69 l->l.held = 1;
rscb2cfc4e2003-09-30 17:47:41 +000070 return 1;
71 }
rscb2cfc4e2003-09-30 17:47:41 +000072}
73
74void
rsc5f8fa942004-12-26 21:51:15 +000075qunlock(QLock *l)
rscb2cfc4e2003-09-30 17:47:41 +000076{
rsc5f8fa942004-12-26 21:51:15 +000077 if(_qunlock)
78 (*_qunlock)(l, getcallerpc(&l));
rscb2cfc4e2003-09-30 17:47:41 +000079 else
rsc5f8fa942004-12-26 21:51:15 +000080 l->l.held = 0;
81}
rscb2cfc4e2003-09-30 17:47:41 +000082
rsc5f8fa942004-12-26 21:51:15 +000083void
84rlock(RWLock *l)
85{
86 if(_rlock)
87 (*_rlock)(l, 1, getcallerpc(&l));
88 else
89 l->readers++;
rscb2cfc4e2003-09-30 17:47:41 +000090}
91
92int
rsc5f8fa942004-12-26 21:51:15 +000093canrlock(RWLock *l)
rscb2cfc4e2003-09-30 17:47:41 +000094{
rsc5f8fa942004-12-26 21:51:15 +000095 if(_rlock)
96 return (*_rlock)(l, 0, getcallerpc(&l));
97 else{
98 if(l->writer)
99 return 0;
100 l->readers++;
rscb2cfc4e2003-09-30 17:47:41 +0000101 return 1;
102 }
rscb2cfc4e2003-09-30 17:47:41 +0000103}
104
105void
rsc5f8fa942004-12-26 21:51:15 +0000106runlock(RWLock *l)
rscb2cfc4e2003-09-30 17:47:41 +0000107{
rsc5f8fa942004-12-26 21:51:15 +0000108 if(_runlock)
109 (*_runlock)(l, getcallerpc(&l));
110 else
111 l->readers--;
112}
rscb2cfc4e2003-09-30 17:47:41 +0000113
rsc5f8fa942004-12-26 21:51:15 +0000114void
115wlock(RWLock *l)
116{
117 if(_wlock)
118 (*_wlock)(l, 1, getcallerpc(&l));
119 else
120 l->writer = (void*)1;
121}
rscb2cfc4e2003-09-30 17:47:41 +0000122
rsc5f8fa942004-12-26 21:51:15 +0000123int
124canwlock(RWLock *l)
125{
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;
rscbe36ff62004-04-29 17:13:24 +0000133 }
rsc5f8fa942004-12-26 21:51:15 +0000134}
rscb2cfc4e2003-09-30 17:47:41 +0000135
rsc5f8fa942004-12-26 21:51:15 +0000136void
137wunlock(RWLock *l)
138{
139 if(_wunlock)
140 (*_wunlock)(l, getcallerpc(&l));
141 else
142 l->writer = nil;
rscb2cfc4e2003-09-30 17:47:41 +0000143}
144
145void
146rsleep(Rendez *r)
147{
rsc5f8fa942004-12-26 21:51:15 +0000148 if(_rsleep)
149 (*_rsleep)(r, getcallerpc(&r));
rscb2cfc4e2003-09-30 17:47:41 +0000150}
151
152int
153rwakeup(Rendez *r)
154{
rsc5f8fa942004-12-26 21:51:15 +0000155 if(_rwakeup)
156 return (*_rwakeup)(r, 0, getcallerpc(&r));
157 return 0;
rscb2cfc4e2003-09-30 17:47:41 +0000158}
159
160int
161rwakeupall(Rendez *r)
162{
rsc5f8fa942004-12-26 21:51:15 +0000163 if(_rwakeup)
164 return (*_rwakeup)(r, 1, getcallerpc(&r));
165 return 0;
rscb2cfc4e2003-09-30 17:47:41 +0000166}