Introduction
Introduction Statistics Contact Development Disclaimer Help
qlock.c - 9base - revived minimalist port of Plan 9 userland to Unix
git clone git://git.suckless.org/9base
Log
Files
Refs
README
LICENSE
---
qlock.c (2268B)
---
1 #include <u.h>
2 #include <libc.h>
3
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 */
9
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);
20
21 void
22 lock(Lock *l)
23 {
24 if(_lock)
25 (*_lock)(l, 1, getcallerpc(&l));
26 else
27 l->held = 1;
28 }
29
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 }
42
43 void
44 unlock(Lock *l)
45 {
46 if(_unlock)
47 (*_unlock)(l, getcallerpc(&l));
48 else
49 l->held = 0;
50 }
51
52 void
53 qlock(QLock *l)
54 {
55 if(_qlock)
56 (*_qlock)(l, 1, getcallerpc(&l));
57 else
58 l->l.held = 1;
59 }
60
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 }
73
74 void
75 qunlock(QLock *l)
76 {
77 if(_qunlock)
78 (*_qunlock)(l, getcallerpc(&l));
79 else
80 l->l.held = 0;
81 }
82
83 void
84 rlock(RWLock *l)
85 {
86 if(_rlock)
87 (*_rlock)(l, 1, getcallerpc(&l));
88 else
89 l->readers++;
90 }
91
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;
102 }
103 }
104
105 void
106 runlock(RWLock *l)
107 {
108 if(_runlock)
109 (*_runlock)(l, getcallerpc(&l));
110 else
111 l->readers--;
112 }
113
114 void
115 wlock(RWLock *l)
116 {
117 if(_wlock)
118 (*_wlock)(l, 1, getcallerpc(&l));
119 else
120 l->writer = (void*)1;
121 }
122
123 int
124 canwlock(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;
133 }
134 }
135
136 void
137 wunlock(RWLock *l)
138 {
139 if(_wunlock)
140 (*_wunlock)(l, getcallerpc(&l));
141 else
142 l->writer = nil;
143 }
144
145 void
146 rsleep(Rendez *r)
147 {
148 if(_rsleep)
149 (*_rsleep)(r, getcallerpc(&r));
150 }
151
152 int
153 rwakeup(Rendez *r)
154 {
155 if(_rwakeup)
156 return (*_rwakeup)(r, 0, getcallerpc(&r));
157 return 0;
158 }
159
160 int
161 rwakeupall(Rendez *r)
162 {
163 if(_rwakeup)
164 return (*_rwakeup)(r, 1, getcallerpc(&r));
165 return 0;
166 }
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.