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