xref: /netbsd-src/lib/librumpuser/rumpuser_pth_dummy.c (revision 1b9578b8c2c1f848eeb16dabbfd7d1f0d9fdefbd)
1 /*	$NetBSD: rumpuser_pth_dummy.c,v 1.2 2011/05/23 20:49:08 joerg Exp $	*/
2 
3 /*
4  * Copyright (c) 2009 Antti Kantee.  All Rights Reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
16  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18  * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
21  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25  * SUCH DAMAGE.
26  */
27 
28 #include <sys/cdefs.h>
29 #if !defined(lint)
30 __RCSID("$NetBSD: rumpuser_pth_dummy.c,v 1.2 2011/05/23 20:49:08 joerg Exp $");
31 #endif /* !lint */
32 
33 #include <sys/time.h>
34 
35 #include <assert.h>
36 #include <errno.h>
37 #include <stdlib.h>
38 #include <stdio.h>
39 #include <string.h>
40 #include <stdint.h>
41 
42 #include <rump/rumpuser.h>
43 
44 #include "rumpuser_int.h"
45 
46 struct rumpuser_cv {};
47 
48 struct rumpuser_mtx {
49 	int v;
50 };
51 
52 struct rumpuser_rw {
53 	int v;
54 };
55 
56 struct rumpuser_mtx rumpuser_aio_mtx;
57 struct rumpuser_cv rumpuser_aio_cv;
58 int rumpuser_aio_head, rumpuser_aio_tail;
59 struct rumpuser_aio rumpuser_aios[N_AIOS];
60 
61 void donada(int);
62 /*ARGSUSED*/
63 void donada(int arg) {}
64 void dounnada(int, int *);
65 /*ARGSUSED*/
66 void dounnada(int arg, int *ap) {}
67 kernel_lockfn   rumpuser__klock = donada;
68 kernel_unlockfn rumpuser__kunlock = dounnada;
69 
70 /*ARGSUSED*/
71 void
72 rumpuser_thrinit(kernel_lockfn lockfn, kernel_unlockfn unlockfn, int threads)
73 {
74 
75 }
76 
77 /*ARGSUSED*/
78 void
79 rumpuser_biothread(void *arg)
80 {
81 
82 	fprintf(stderr, "rumpuser: threads not available\n");
83 	abort();
84 }
85 
86 /*ARGSUSED*/
87 int
88 rumpuser_thread_create(void *(*f)(void *), void *arg, const char *thrname)
89 {
90 
91 	fprintf(stderr, "rumpuser: threads not available\n");
92 	abort();
93 	return 0;
94 }
95 
96 void
97 rumpuser_thread_exit(void)
98 {
99 
100 	fprintf(stderr, "rumpuser: threads not available\n");
101 	abort();
102 }
103 
104 void
105 rumpuser_mutex_init(struct rumpuser_mtx **mtx)
106 {
107 
108 	*mtx = calloc(1, sizeof(struct rumpuser_mtx));
109 }
110 
111 void
112 rumpuser_mutex_recursive_init(struct rumpuser_mtx **mtx)
113 {
114 
115 	rumpuser_mutex_init(mtx);
116 }
117 
118 void
119 rumpuser_mutex_enter(struct rumpuser_mtx *mtx)
120 {
121 
122 	mtx->v++;
123 }
124 
125 int
126 rumpuser_mutex_tryenter(struct rumpuser_mtx *mtx)
127 {
128 
129 	mtx->v++;
130 	return 1;
131 }
132 
133 void
134 rumpuser_mutex_exit(struct rumpuser_mtx *mtx)
135 {
136 
137 	mtx->v--;
138 }
139 
140 void
141 rumpuser_mutex_destroy(struct rumpuser_mtx *mtx)
142 {
143 
144 	free(mtx);
145 }
146 
147 int
148 rumpuser_mutex_held(struct rumpuser_mtx *mtx)
149 {
150 
151 	return mtx->v;
152 }
153 
154 void
155 rumpuser_rw_init(struct rumpuser_rw **rw)
156 {
157 
158 	*rw = calloc(1, sizeof(struct rumpuser_rw));
159 }
160 
161 void
162 rumpuser_rw_enter(struct rumpuser_rw *rw, int write)
163 {
164 
165 	if (write) {
166 		rw->v++;
167 		assert(rw->v == 1);
168 	} else {
169 		assert(rw->v <= 0);
170 		rw->v--;
171 	}
172 }
173 
174 int
175 rumpuser_rw_tryenter(struct rumpuser_rw *rw, int write)
176 {
177 
178 	rumpuser_rw_enter(rw, write);
179 	return 1;
180 }
181 
182 void
183 rumpuser_rw_exit(struct rumpuser_rw *rw)
184 {
185 
186 	if (rw->v > 0) {
187 		assert(rw->v == 1);
188 		rw->v--;
189 	} else {
190 		rw->v++;
191 	}
192 }
193 
194 void
195 rumpuser_rw_destroy(struct rumpuser_rw *rw)
196 {
197 
198 	free(rw);
199 }
200 
201 int
202 rumpuser_rw_held(struct rumpuser_rw *rw)
203 {
204 
205 	return rw->v != 0;
206 }
207 
208 int
209 rumpuser_rw_rdheld(struct rumpuser_rw *rw)
210 {
211 
212 	return rw->v < 0;
213 }
214 
215 int
216 rumpuser_rw_wrheld(struct rumpuser_rw *rw)
217 {
218 
219 	return rw->v > 0;
220 }
221 
222 /*ARGSUSED*/
223 void
224 rumpuser_cv_init(struct rumpuser_cv **cv)
225 {
226 
227 }
228 
229 /*ARGSUSED*/
230 void
231 rumpuser_cv_destroy(struct rumpuser_cv *cv)
232 {
233 
234 }
235 
236 /*ARGSUSED*/
237 void
238 rumpuser_cv_wait(struct rumpuser_cv *cv, struct rumpuser_mtx *mtx)
239 {
240 
241 }
242 
243 /*ARGSUSED*/
244 int
245 rumpuser_cv_timedwait(struct rumpuser_cv *cv, struct rumpuser_mtx *mtx,
246 	int64_t sec, int64_t nsec)
247 {
248 	struct timespec ts;
249 
250 	/*LINTED*/
251 	ts.tv_sec = sec;
252 	/*LINTED*/
253 	ts.tv_nsec = nsec;
254 
255 	nanosleep(&ts, NULL);
256 	return 0;
257 }
258 
259 /*ARGSUSED*/
260 void
261 rumpuser_cv_signal(struct rumpuser_cv *cv)
262 {
263 
264 }
265 
266 /*ARGSUSED*/
267 void
268 rumpuser_cv_broadcast(struct rumpuser_cv *cv)
269 {
270 
271 }
272 
273 /*ARGSUSED*/
274 int
275 rumpuser_cv_has_waiters(struct rumpuser_cv *cv)
276 {
277 
278 	return 0;
279 }
280 
281 /*
282  * curlwp
283  */
284 
285 static struct lwp *curlwp;
286 void
287 rumpuser_set_curlwp(struct lwp *l)
288 {
289 
290 	curlwp = l;
291 }
292 
293 struct lwp *
294 rumpuser_get_curlwp(void)
295 {
296 
297 	return curlwp;
298 }
299