void rumpuser_rw_downgrade(struct rumpuser_rw *rw) { bmk_assert(rw->o == rumpuser_curlwp()); rw->v = -1; }
int rumpuser_rw_tryenter(int enum_rumprwlock, struct rumpuser_rw *rw) { enum rumprwlock lk = enum_rumprwlock; int rv = -1; switch (lk) { case RUMPUSER_RW_WRITER: if (rw->o == NULL) { rw->o = rumpuser_curlwp(); rv = 0; } else { rv = BMK_EBUSY; } break; case RUMPUSER_RW_READER: if (rw->o == NULL && TAILQ_EMPTY(&rw->wwait)) { rw->v++; rv = 0; } else { rv = BMK_EBUSY; } break; } return rv; }
int rumpuser_rw_tryupgrade(struct rumpuser_rw *rw) { if (rw->v == -1) { rw->v = 1; rw->o = rumpuser_curlwp(); return 0; } return BMK_EBUSY; }
void rumpuser_curlwpop(int enum_rumplwpop, struct lwp *l) { struct bmk_thread *thread; enum rumplwpop op = enum_rumplwpop; switch (op) { case RUMPUSER_LWP_CREATE: case RUMPUSER_LWP_DESTROY: break; case RUMPUSER_LWP_SET: assert(rumpuser_curlwp() == NULL); thread = bmk_sched_current(); bmk_sched_settls(thread, BMK_TLS_RUMPLWP, l); break; case RUMPUSER_LWP_CLEAR: assert(rumpuser_curlwp() == l); thread = bmk_sched_current(); bmk_sched_settls(thread, BMK_TLS_RUMPLWP, NULL); break; } }
void rumpuser_rw_held(int enum_rumprwlock, struct rumpuser_rw *rw, int *rvp) { enum rumprwlock lk = enum_rumprwlock; switch (lk) { case RUMPUSER_RW_WRITER: *rvp = rw->o == rumpuser_curlwp(); break; case RUMPUSER_RW_READER: *rvp = rw->v > 0; break; } }
int rumpuser_mutex_tryenter(struct rumpuser_mtx *mtx) { struct lwp *l = rumpuser_curlwp(); if (mtx->bmk_o == bmk_current) { bmk_platform_halt("rumpuser mutex: locking against myself"); } if (mtx->v) return BMK_EBUSY; mtx->v = 1; mtx->o = l; mtx->bmk_o = bmk_current; return 0; }