~kris/9p

9hist

611464ba166de69d4145cff82353909d5f120019 — David du Colombier 30 years ago c59f6df
Plan 9 from Bell Labs 1996-05-11
6 files changed, 45 insertions(+), 21 deletions(-)

M carrera/dat.h
M pc/dat.h
M port/portdat.h
M port/proc.c
M port/taslock.c
M power/dat.h
M carrera/dat.h => carrera/dat.h +1 -0
@@ 27,6 27,7 @@ struct Lock
	ulong	sr;
	ulong	pc;
	ulong	pid;
	int	pri;
};

struct Label

M pc/dat.h => pc/dat.h +1 -0
@@ 30,6 30,7 @@ struct Lock
	ulong	sr;
	ulong	pc;
	ulong	pid;
	int	pri;
};

struct Label

M port/portdat.h => port/portdat.h +1 -0
@@ 507,6 507,7 @@ enum
	NNOTE = 5,

	Nrq		= 20,	/* number of scheduler priority levels */
	PriLock		= 19,	/* priority for processes holding locks */
	PriNormal	= 10,	/* base priority for normal processes */
	PriKproc	= 13,	/* base priority for kernel processes */
	PriRoot		= 13,	/* base priority for root processes */

M port/proc.c => port/proc.c +6 -2
@@ 137,8 137,12 @@ ready(Proc *p)

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

M port/taslock.c => port/taslock.c +35 -19
@@ 16,31 16,34 @@ lockloop(Lock *l, ulong pc)
void
lock(Lock *l)
{
	int i;
	ulong pc, pid;
	int pri, i;
	ulong pc;

	pc = getcallerpc(l);
	pid = up ? up->pid : 0;

	if(tas(&l->key) == 0){
		l->pc = pc;
		l->pid = pid;
	if(up == 0) {
		for(i=0; i<1000000; i++)
			if(tas(&l->key) == 0){
				l->pc = pc;
				return;
			}
		lockloop(l, pc);
		return;
	}

	for(;;){
		i = 0;
		while(l->key)
			if(i++ > 100000000){
				i = 0;
				lockloop(l, pc);
			}
	pri = up->priority;
	up->priority = PriLock;

	for(i=0; i<1000; i++){
		if(tas(&l->key) == 0){
			l->pri = pri;
			l->pc = pc;
			l->pid = pid;
			return;
		}
		if(conf.nmach == 1 && up->state == Running && (getstatus()&IE))
			sched();
	}
	lockloop(l, pc);
}

void


@@ 75,19 78,32 @@ ilock(Lock *l)
int
canlock(Lock *l)
{
	if(tas(&l->key))
		return 0;
	int pri;

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

void
unlock(Lock *l)
{
	l->key = 0;
	int p;

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

void

M power/dat.h => power/dat.h +1 -0
@@ 26,6 26,7 @@ struct Lock
	ulong	pc;
	ulong	sr;
	ulong	pid;
	int	pri;
};

struct Label