Blame


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