From 611464ba166de69d4145cff82353909d5f120019 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Sat, 11 May 1996 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1996-05-11 --- carrera/dat.h | 1 + pc/dat.h | 1 + port/portdat.h | 1 + port/proc.c | 8 ++++++-- port/taslock.c | 54 ++++++++++++++++++++++++++++++++------------------ power/dat.h | 1 + 6 files changed, 45 insertions(+), 21 deletions(-) diff --git a/carrera/dat.h b/carrera/dat.h index e4dffff10d14c50ece09aaf70e20da9462bb8885..d285b53735cdaa3ecec03b63f9d5d4e1479d7b2e 100644 --- a/carrera/dat.h +++ b/carrera/dat.h @@ -27,6 +27,7 @@ struct Lock ulong sr; ulong pc; ulong pid; + int pri; }; struct Label diff --git a/pc/dat.h b/pc/dat.h index 9d978318a6cf857cebd489e6b743b1f40ca756bc..22795973d5a0171b66ec0b108177a9a8bbd97fec 100644 --- a/pc/dat.h +++ b/pc/dat.h @@ -30,6 +30,7 @@ struct Lock ulong sr; ulong pc; ulong pid; + int pri; }; struct Label diff --git a/port/portdat.h b/port/portdat.h index ef34aa59cca951b65a26f91affd19ea9907fe407..47dd3941ded2049f400d3db426da4f86c9dcc8c7 100644 --- a/port/portdat.h +++ b/port/portdat.h @@ -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 */ diff --git a/port/proc.c b/port/proc.c index fc9ebbfa788d442fc887d29bed7e03f859d644c6..3686fbbcedc99199b263a17fd13bf31256d11c56 100644 --- a/port/proc.c +++ b/port/proc.c @@ -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; diff --git a/port/taslock.c b/port/taslock.c index f0b2598273fca18fb949c62cf115fa737af456e7..bf1e5f07e21fd7db6953af66446425c64da4571d 100644 --- a/port/taslock.c +++ b/port/taslock.c @@ -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 diff --git a/power/dat.h b/power/dat.h index 1f00ead903a08150e38a5d8012e9b49a58708cc5..b70b42b8a673b8a71e9179beeebe5eb086c04905 100644 --- a/power/dat.h +++ b/power/dat.h @@ -26,6 +26,7 @@ struct Lock ulong pc; ulong sr; ulong pid; + int pri; }; struct Label