1 5f8fa947 2004-12-26 devnull #include <u.h>
2 5f8fa947 2004-12-26 devnull #include <libc.h>
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.
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);
22 5f8fa947 2004-12-26 devnull lock(Lock *l)
24 5f8fa947 2004-12-26 devnull if(_lock)
25 5f8fa947 2004-12-26 devnull (*_lock)(l, 1, getcallerpc(&l));
27 5f8fa947 2004-12-26 devnull l->held = 1;
31 5f8fa947 2004-12-26 devnull canlock(Lock *l)
33 5f8fa947 2004-12-26 devnull if(_lock)
34 5f8fa947 2004-12-26 devnull return (*_lock)(l, 0, getcallerpc(&l));
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;
44 5f8fa947 2004-12-26 devnull unlock(Lock *l)
46 5f8fa947 2004-12-26 devnull if(_unlock)
47 5f8fa947 2004-12-26 devnull (*_unlock)(l, getcallerpc(&l));
49 5f8fa947 2004-12-26 devnull l->held = 0;
53 5f8fa947 2004-12-26 devnull qlock(QLock *l)
55 5f8fa947 2004-12-26 devnull if(_qlock)
56 5f8fa947 2004-12-26 devnull (*_qlock)(l, 1, getcallerpc(&l));
58 5f8fa947 2004-12-26 devnull l->l.held = 1;
62 5f8fa947 2004-12-26 devnull canqlock(QLock *l)
64 5f8fa947 2004-12-26 devnull if(_qlock)
65 5f8fa947 2004-12-26 devnull return (*_qlock)(l, 0, getcallerpc(&l));
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;
75 5f8fa947 2004-12-26 devnull qunlock(QLock *l)
77 5f8fa947 2004-12-26 devnull if(_qunlock)
78 5f8fa947 2004-12-26 devnull (*_qunlock)(l, getcallerpc(&l));
80 5f8fa947 2004-12-26 devnull l->l.held = 0;
84 5f8fa947 2004-12-26 devnull rlock(RWLock *l)
86 5f8fa947 2004-12-26 devnull if(_rlock)
87 5f8fa947 2004-12-26 devnull (*_rlock)(l, 1, getcallerpc(&l));
89 5f8fa947 2004-12-26 devnull l->readers++;
93 5f8fa947 2004-12-26 devnull canrlock(RWLock *l)
95 5f8fa947 2004-12-26 devnull if(_rlock)
96 5f8fa947 2004-12-26 devnull return (*_rlock)(l, 0, getcallerpc(&l));
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;
106 5f8fa947 2004-12-26 devnull runlock(RWLock *l)
108 5f8fa947 2004-12-26 devnull if(_runlock)
109 5f8fa947 2004-12-26 devnull (*_runlock)(l, getcallerpc(&l));
111 5f8fa947 2004-12-26 devnull l->readers--;
115 5f8fa947 2004-12-26 devnull wlock(RWLock *l)
117 5f8fa947 2004-12-26 devnull if(_wlock)
118 5f8fa947 2004-12-26 devnull (*_wlock)(l, 1, getcallerpc(&l));
120 5f8fa947 2004-12-26 devnull l->writer = (void*)1;
124 5f8fa947 2004-12-26 devnull canwlock(RWLock *l)
126 5f8fa947 2004-12-26 devnull if(_wlock)
127 5f8fa947 2004-12-26 devnull return (*_wlock)(l, 0, getcallerpc(&l));
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;
137 5f8fa947 2004-12-26 devnull wunlock(RWLock *l)
139 5f8fa947 2004-12-26 devnull if(_wunlock)
140 5f8fa947 2004-12-26 devnull (*_wunlock)(l, getcallerpc(&l));
142 5f8fa947 2004-12-26 devnull l->writer = nil;
146 b2cfc4e2 2003-09-30 devnull rsleep(Rendez *r)
148 5f8fa947 2004-12-26 devnull if(_rsleep)
149 5f8fa947 2004-12-26 devnull (*_rsleep)(r, getcallerpc(&r));
153 b2cfc4e2 2003-09-30 devnull rwakeup(Rendez *r)
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;
161 b2cfc4e2 2003-09-30 devnull rwakeupall(Rendez *r)
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;