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 b2cfc4e2 2003-09-30 devnull }
104 b2cfc4e2 2003-09-30 devnull
105 b2cfc4e2 2003-09-30 devnull void
106 5f8fa947 2004-12-26 devnull runlock(RWLock *l)
107 b2cfc4e2 2003-09-30 devnull {
108 5f8fa947 2004-12-26 devnull if(_runlock)
109 5f8fa947 2004-12-26 devnull (*_runlock)(l, getcallerpc(&l));
110 5f8fa947 2004-12-26 devnull else
111 5f8fa947 2004-12-26 devnull l->readers--;
112 b2cfc4e2 2003-09-30 devnull }
113 b2cfc4e2 2003-09-30 devnull
114 b2cfc4e2 2003-09-30 devnull void
115 5f8fa947 2004-12-26 devnull wlock(RWLock *l)
116 b2cfc4e2 2003-09-30 devnull {
117 5f8fa947 2004-12-26 devnull if(_wlock)
118 5f8fa947 2004-12-26 devnull (*_wlock)(l, 1, getcallerpc(&l));
119 b2cfc4e2 2003-09-30 devnull else
120 5f8fa947 2004-12-26 devnull l->writer = (void*)1;
121 b2cfc4e2 2003-09-30 devnull }
122 b2cfc4e2 2003-09-30 devnull
123 b2cfc4e2 2003-09-30 devnull int
124 5f8fa947 2004-12-26 devnull canwlock(RWLock *l)
125 b2cfc4e2 2003-09-30 devnull {
126 5f8fa947 2004-12-26 devnull if(_wlock)
127 5f8fa947 2004-12-26 devnull return (*_wlock)(l, 0, getcallerpc(&l));
128 5f8fa947 2004-12-26 devnull else{
129 5f8fa947 2004-12-26 devnull if(l->writer || l->readers)
130 5f8fa947 2004-12-26 devnull return 0;
131 5f8fa947 2004-12-26 devnull l->writer = (void*)1;
132 b2cfc4e2 2003-09-30 devnull return 1;
133 b2cfc4e2 2003-09-30 devnull }
134 b2cfc4e2 2003-09-30 devnull }
135 b2cfc4e2 2003-09-30 devnull
136 b2cfc4e2 2003-09-30 devnull void
137 5f8fa947 2004-12-26 devnull wunlock(RWLock *l)
138 b2cfc4e2 2003-09-30 devnull {
139 5f8fa947 2004-12-26 devnull if(_wunlock)
140 5f8fa947 2004-12-26 devnull (*_wunlock)(l, getcallerpc(&l));
141 5f8fa947 2004-12-26 devnull else
142 5f8fa947 2004-12-26 devnull l->writer = nil;
143 b2cfc4e2 2003-09-30 devnull }
144 b2cfc4e2 2003-09-30 devnull
145 b2cfc4e2 2003-09-30 devnull void
146 b2cfc4e2 2003-09-30 devnull rsleep(Rendez *r)
147 b2cfc4e2 2003-09-30 devnull {
148 5f8fa947 2004-12-26 devnull if(_rsleep)
149 5f8fa947 2004-12-26 devnull (*_rsleep)(r, getcallerpc(&r));
150 b2cfc4e2 2003-09-30 devnull }
151 b2cfc4e2 2003-09-30 devnull
152 b2cfc4e2 2003-09-30 devnull int
153 b2cfc4e2 2003-09-30 devnull rwakeup(Rendez *r)
154 b2cfc4e2 2003-09-30 devnull {
155 5f8fa947 2004-12-26 devnull if(_rwakeup)
156 5f8fa947 2004-12-26 devnull return (*_rwakeup)(r, 0, getcallerpc(&r));
157 5f8fa947 2004-12-26 devnull return 0;
158 b2cfc4e2 2003-09-30 devnull }
159 b2cfc4e2 2003-09-30 devnull
160 b2cfc4e2 2003-09-30 devnull int
161 b2cfc4e2 2003-09-30 devnull rwakeupall(Rendez *r)
162 b2cfc4e2 2003-09-30 devnull {
163 5f8fa947 2004-12-26 devnull if(_rwakeup)
164 5f8fa947 2004-12-26 devnull return (*_rwakeup)(r, 1, getcallerpc(&r));
165 5f8fa947 2004-12-26 devnull return 0;
166 06bb4ed2 2004-09-17 devnull }