M carrera/clock.c => carrera/clock.c +2 -7
@@ 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)
M carrera/trap.c => carrera/trap.c +1 -1
@@ 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();
}
M pc/clock.c => pc/clock.c +1 -1
@@ 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 */
M port/proc.c => port/proc.c +10 -4
@@ 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;
}
}
M port/taslock.c => port/taslock.c +22 -22
@@ 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);
}
M power/clock.c => power/clock.c +1 -1
@@ 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 */