shithub: cursedfs

ref: fba678b80d8c266077e12cd43d5e42d3ab6e411c
dir: /cursed.c/

View raw version
#include <u.h>
#include <libc.h>
#include <fcall.h>
#include <thread.h>
#include <9p.h>
#include "cursed.h"

Sem *sems[Nsems];

Sem *
newsem(char *name)
{
	int i;

	for(i = 0; i < Nsems; i++)
		if(sems[i] == nil)
			break;
	if(i == Nsems)
		return nil;
	sems[i] = emalloc9p(sizeof(Sem));
	memset(sems[i], 0, sizeof(Sem));
	sems[i]->ref = 2;
	sems[i]->name = estrdup9p(name);
	return sems[i];
}

void
closesem(Sem *s)
{
	if(s != nil && decref(s) == 0){
		assert(s->reqs == nil);
		assert(sems[s->id] == s);
		sems[s->id] = nil;
		free(s->name);
		free(s);
	}
}

void
queuereq(Sem *s, Req *r)
{
	QReq *q;
	QReq **l;

	q = emalloc9p(sizeof(QReq));
	q->r = r;
	q->next = nil;
	for(l = &s->reqs; *l != nil; l = &(*l)->next)
		;
	*l = q;
}

Req *
dequeuereq(Sem *s)
{
	QReq *q;
	Req *r;

	if(s->reqs == nil)
		return nil;
	q = s->reqs;
	s->reqs = q->next;
	r = q->r;
	free(q);
	return r;
}

int
queuedreqs(Sem *s)
{
	return s->reqs != nil;
}