From 16c2bd6d14bab9dea7d12a7db27524c85f1a2671 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Mon, 9 Jan 1995 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1995-01-09 --- carrera/clock.c | 9 ++------- carrera/trap.c | 2 +- pc/clock.c | 2 +- port/proc.c | 14 ++++++++++---- port/taslock.c | 44 ++++++++++++++++++++++---------------------- power/clock.c | 2 +- 6 files changed, 37 insertions(+), 36 deletions(-) diff --git a/carrera/clock.c b/carrera/clock.c index 7e655480160d484ed99486f586c3db6707f3d09f..da3bef9a3b828bcac5a48e7c52715b419742ff92 100644 --- a/carrera/clock.c +++ b/carrera/clock.c @@ -78,13 +78,8 @@ clock(Ureg *ur) if(up == 0 || up->state != Running) return; - if(anyready()) { - n = up->inlock; - if(n == 0) - sched(); - else - up->inlock = n-1; - } + if(anyready() && !up->inlock) + sched(); /* user profiling clock */ if(ur->status & KUSER) diff --git a/carrera/trap.c b/carrera/trap.c index 1f6bcaf59cd3db5c559cfb1710c26f9d171385d3..a98f8308343eb7377e904c9de80dcc652889fff5 100644 --- a/carrera/trap.c +++ b/carrera/trap.c @@ -397,7 +397,7 @@ intr(Ureg *ur) } /* preemptive scheduling */ - if(up && up->state == Running && anyhigher() && up->inlock == 0) + if(up && up->state == Running && anyhigher() && !up->inlock) sched(); } diff --git a/pc/clock.c b/pc/clock.c index 713f6efe2db9333190f94f19197ce9e9db36f84d..042928816766422d5f33b0f16128ea0444c7b475 100644 --- a/pc/clock.c +++ b/pc/clock.c @@ -45,7 +45,7 @@ clock(Ureg *ur, void *arg) uartclock(); if(up && up->state == Running){ - if(anyready()) + if(anyready() && !up->inlock) sched(); /* user profiling clock */ diff --git a/port/proc.c b/port/proc.c index 734ea01b58c829886bf8fb3cc4736027908fcc04..005ac95edfe44b3dfd36776d233faf565fb63297 100644 --- a/port/proc.c +++ b/port/proc.c @@ -115,7 +115,6 @@ anyhigher(void) Proc *p; int pri; - return runq.n; pri = up->pri; for(p=runq.head; p; p=p->rnext) if(p->pri <= pri) @@ -961,6 +960,13 @@ accounttime(void) p->pri += priconst[p->nice]; } + if(up) { + i = up->inlock-1; + if(i < 0) + i = 0; + up->inlock = i; + } + /* only one processor gets to compute system load averages */ if(m->machno != 0) return; @@ -974,8 +980,8 @@ accounttime(void) /* * decay per-process cpu usage - * pri = (7/8)*pri twice per second - * tc = (7/8)^2/(1-(7/8)^2) = 3.27 sec + * pri = (3/4)*pri twice per second + * tc = (3/4)^2/(1-(3/4)^2) = 1.286 sec */ m0ticks--; if(m0ticks <= 0) { @@ -984,7 +990,7 @@ accounttime(void) for(i=conf.nproc-1; i!=0; i--,p++) if(p->state != Dead) { pri = p->pri; - pri -= pri >> 3; + pri -= pri >> 2; p->pri = pri; } } diff --git a/port/taslock.c b/port/taslock.c index ad282313701c979078730b19ae048bb597a3493e..4b47aabad23cffc51b8f183406a946b5155e56b6 100644 --- a/port/taslock.c +++ b/port/taslock.c @@ -38,33 +38,23 @@ lock(Lock *l) } } -void -ilock(Lock *l) +int +canlock(Lock *l) { - ulong x; - - x = splhi(); - if(tas(&l->key) == 0){ - l->sr = x; - return; - } + int n; - for(;;){ - while(l->key) - ; - if(tas(&l->key) == 0){ - l->sr = x; - return; + if(up) { + n = up->inlock; + up->inlock = n+2; + if(tas(&l->key)) { + up->inlock = n; + return 0; } + return 1; } -} -int -canlock(Lock *l) -{ if(tas(&l->key)) return 0; - return 1; } @@ -73,13 +63,23 @@ unlock(Lock *l) { int n; - l->key = 0; if(up) { n = up->inlock-2; if(n < 0) n = 0; up->inlock = n; } + l->key = 0; +} + +void +ilock(Lock *l) +{ + ulong sr; + + sr = splhi(); + lock(l); + l->sr = sr; } void @@ -88,6 +88,6 @@ iunlock(Lock *l) ulong sr; sr = l->sr; - l->key = 0; + unlock(l); splx(sr); } diff --git a/power/clock.c b/power/clock.c index 4c865ca970782c07b1a0525d1f9c443db082d348..e7caaf0fac7bcbc00e731946a4c73c65f5c11b4a 100644 --- a/power/clock.c +++ b/power/clock.c @@ -103,7 +103,7 @@ clock(Ureg *ur) if(up == 0 || (ur->status&IEP) == 0 || up->state != Running) return; - if(anyready()) + if(anyready() && !up->inlock) sched(); /* user profiling clock */