~kris/9p

9hist

41171b9ebd84e6d78c77cd93ac7c18ddb444f22b — David du Colombier 30 years ago 61ab52e
Plan 9 from Bell Labs 1996-05-16
3 files changed, 26 insertions(+), 20 deletions(-)

M port/portdat.h
M port/proc.c
M port/taslock.c
M port/portdat.h => port/portdat.h +1 -0
@@ 598,6 598,7 @@ struct Proc
	ulong	art;		/* avg # ticks used since last blocked */
	ulong	movetime;	/* last time process switched processors */
	ulong	readytime;	/* time process went ready */
	ulong	lockpri;	/* priority of process holding lock we're trying for */

	void	*ureg;		/* User registers for notes */
	void	*dbgreg;	/* User registers for devproc */

M port/proc.c => port/proc.c +16 -9
@@ 130,32 130,39 @@ enum
void
ready(Proc *p)
{
	int s, pri;
	int s, pri, base;
	Schedq *rq;

	s = splhi();

	/*
	 *  This interacts with code in taslock().  The intent is to keep the
	 *  priority of a process trying for a lock lower than the process holding
	 *  the lock.
	 */
	if(p->lockpri)
		base = p->lockpri;
	else
		base = p->basepri;

	/* history counts */
	if(p->state == Running){
		if(up->priority == PriLock){
			pri = 0;
		} else {
			p->rt++;
			pri = ((p->art + (p->rt<<1))>>2)/Squantum;
		}
		p->rt++;
		pri = ((p->art + (p->rt<<1))>>2)/Squantum;
	} else {
		p->art = (p->art + (p->rt<<1))>>2;
		p->rt = 0;
		pri = p->art/Squantum;
	}
	pri = p->basepri - pri;
	pri = base - pri;
	if(pri < 0)
		pri = 0;

	/* the only intersection between the classes is at PriNormal */
	if(pri < PriNormal && p->basepri > PriNormal)
	if(pri < PriNormal && base > PriNormal)
		pri = PriNormal;
	p->priority = pri;

	rq = &runq[p->priority];

	lock(runq);

M port/taslock.c => port/taslock.c +9 -11
@@ 25,18 25,21 @@ lock(Lock *l)
		for(i=0; i<1000000; i++)
			if(tas(&l->key) == 0){
				l->pc = pc;
				l->pri = 0;
				return;
			}
		lockloop(l, pc);
		return;
	}

	/* priority interacts with code in ready() in proc.c */
	pri = up->priority;
	up->priority = PriLock;

	for(i=0; i<1000; i++){
		up->lockpri = l->pri;		/* assume priority of process holding lock */
		if(tas(&l->key) == 0){
			l->pri = pri;
			up->lockpri = 0;	/* back to normal priority */
			l->pc = pc;
			return;
		}


@@ 44,6 47,7 @@ lock(Lock *l)
			sched();
	}
	lockloop(l, pc);
	up->lockpri = 0;	/* back to normal priority */
}

void


@@ 80,13 84,11 @@ canlock(Lock *l)
{
	int pri;

	SET(pri);
	if(up) {
	if(up)
		pri = up->priority;
		up->priority = PriLock;
	}
	else
		pri = 0;
	if(tas(&l->key)) {
		up->priority = pri;
		l->pc = getcallerpc(l);
		return 0;
	}


@@ 97,13 99,9 @@ canlock(Lock *l)
void
unlock(Lock *l)
{
	int p;

	p = l->pri;
	l->pc = 0;
	l->key = 0;
	if(up != 0)
		up->priority = p;
	l->pri = 0;
}

void