From 41171b9ebd84e6d78c77cd93ac7c18ddb444f22b Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Thu, 16 May 1996 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1996-05-16 --- port/portdat.h | 1 + port/proc.c | 25 ++++++++++++++++--------- port/taslock.c | 20 +++++++++----------- 3 files changed, 26 insertions(+), 20 deletions(-) diff --git a/port/portdat.h b/port/portdat.h index 47dd3941ded2049f400d3db426da4f86c9dcc8c7..5d4251aa80999ee0c10e9ac48c33e9a31ee1405f 100644 --- a/port/portdat.h +++ b/port/portdat.h @@ -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 */ diff --git a/port/proc.c b/port/proc.c index 3686fbbcedc99199b263a17fd13bf31256d11c56..5d92c7dc12e7fc654e0cd943b581d65d7e4a9873 100644 --- a/port/proc.c +++ b/port/proc.c @@ -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); diff --git a/port/taslock.c b/port/taslock.c index bf1e5f07e21fd7db6953af66446425c64da4571d..e01ef543af569207e2d8d156bea0583f7c7a93a9 100644 --- a/port/taslock.c +++ b/port/taslock.c @@ -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