~kris/9p

9hist

7069bd0a68052fb04825a7cd8679a5d0ebbd0cdb — David du Colombier 35 years ago f515d58
Plan 9 from Bell Labs 1991-04-20
2 files changed, 35 insertions(+), 18 deletions(-)

M port/proc.c
M port/stream.c
M port/proc.c => port/proc.c +32 -17
@@ 18,12 18,14 @@ struct
	Proc	*free;
}procalloc;

struct
typedef struct
{
	Lock;
	Proc	*head;
	Proc	*tail;
}runq;
}Schedq;

Schedq runhiq, runloq;

char *statename[]={	/* BUG: generate automatically */
	"Dead",


@@ 75,7 77,7 @@ schedinit(void)		/* never returns */
void
sched(void)
{
	uchar procstate[64];		/* sleeze for portability */
	uchar procstate[64];		/* sleaze for portability */
	Proc *p;
	ulong tlbvirt, tlbphys;
	void (*f)(ulong, ulong);


@@ 104,24 106,31 @@ sched(void)
int
anyready(void)
{
	return runq.head != 0;
	return runloq.head != 0 || runhiq.head != 0;
}

void
ready(Proc *p)
{
	Schedq *rq;
	int s;

	s = splhi();
	lock(&runq);
	if(p->state == Running)
		rq = &runloq;
	else
		rq = &runhiq;

	lock(&runhiq);
	p->rnext = 0;
	if(runq.tail)
		runq.tail->rnext = p;
	if(rq->tail)
		rq->tail->rnext = p;
	else
		runq.head = p;
	runq.tail = p;
		rq->head = p;
	rq->tail = p;

	p->state = Ready;
	unlock(&runq);
	unlock(&runhiq);
	splx(s);
}



@@ 131,27 140,33 @@ ready(Proc *p)
Proc*
runproc(void)
{
	Schedq *rq;
	Proc *p;
	int i;

loop:
	while(runq.head == 0)
	while(runhiq.head==0 && runloq.head==0)
		for(i=0; i<10; i++)	/* keep out of shared memory for a while */
			;
	splhi();
	lock(&runq);
	p = runq.head;
	lock(&runhiq);
	if(runhiq.head)
		rq = &runhiq;
	else
		rq = &runloq;

	p = rq->head;
	if(p==0 || p->mach){	/* p->mach==0 only when process state is saved */
		unlock(&runq);
		unlock(&runhiq);
		spllo();
		goto loop;
	}
	if(p->rnext == 0)
		runq.tail = 0;
	runq.head = p->rnext;
		rq->tail = 0;
	rq->head = p->rnext;
	if(p->state != Ready)
		print("runproc %s %d %s\n", p->text, p->pid, statename[p->state]);
	unlock(&runq);
	unlock(&runhiq);
	p->state = Scheding;
	spllo();
	return p;

M port/stream.c => port/stream.c +3 -1
@@ 241,15 241,17 @@ allocb(ulong size)
void
freeb(Block *bp)
{
	ulong mark[1];
	Block *nbp;
	Bclass *bcp;
	int x;

	if((bp->flags&S_CLASS) >= Nclass)
		panic("freeb class");

	for(; bp; bp = nbp){
		bcp = &bclass[bp->flags & S_CLASS];
		bp->flags = S_CLASS;			/* Check for doulbe free */
		bp->flags = bp->flags|S_CLASS;		/* Check for doulbe free */
		lock(bcp);
		bp->rptr = bp->wptr = 0;
		if(bcp->first)