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