示例#1
0
void
rumpuser_rw_downgrade(struct rumpuser_rw *rw)
{

	bmk_assert(rw->o == rumpuser_curlwp());
	rw->v = -1;
}
示例#2
0
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;
}
示例#3
0
int
rumpuser_rw_tryupgrade(struct rumpuser_rw *rw)
{

	if (rw->v == -1) {
		rw->v = 1;
		rw->o = rumpuser_curlwp();
		return 0;
	}

	return BMK_EBUSY;
}
示例#4
0
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;
	}
}
示例#5
0
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;
	}
}
示例#6
0
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;
}