From 462a175606b9da45c0a1167c7c86b32fabb2d80b Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Mon, 9 Oct 1995 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1995-10-09 --- carrera/dat.h | 1 + pc/dat.h | 1 + port/proc.c | 7 ++++++- port/taslock.c | 24 +++++++++++++++++++++--- 4 files changed, 29 insertions(+), 4 deletions(-) diff --git a/carrera/dat.h b/carrera/dat.h index 74f3039c66476f725b5568323910c56f26895854..8750f7c38ac11e185acc9d3b0decee6f8e35476c 100644 --- a/carrera/dat.h +++ b/carrera/dat.h @@ -25,6 +25,7 @@ struct Lock { ulong key; /* semaphore (non-zero = locked) */ ulong sr; + ulong pc; }; struct Label diff --git a/pc/dat.h b/pc/dat.h index 71a274c0e8100996c36e04dc4992ca33f328e349..1cadf39903c7f8331403f0230c1db28c472a5255 100644 --- a/pc/dat.h +++ b/pc/dat.h @@ -28,6 +28,7 @@ struct Lock { ulong key; ulong sr; + ulong pc; }; struct Label diff --git a/port/proc.c b/port/proc.c index d387e1aaa1bda50e6f597d705a9d34226635afc9..77b043020370cb32bebbce7728626cad7cf21e26 100644 --- a/port/proc.c +++ b/port/proc.c @@ -793,6 +793,10 @@ procdump(void) ulong bss; Schedq *rq; + if(up) + print("up %d\n", up->pid); + else + print("no current process\n"); for(i=0; istate == Dead) @@ -813,7 +817,8 @@ procdump(void) continue; print("rq%d:", rq-runq); for(p = rq->head; p; p = p->rnext) - print(" %d(%d)", p->pid, m->ticks - p->readytime); + print(" %d(%d, %d)", p->pid, m->ticks - p->readytime, + m->ticks - p->movetime); print("\n"); } print("nrdy %d\n", nrdy); diff --git a/port/taslock.c b/port/taslock.c index 0e1bd45d6d83eb749e8f3f975e403f603323e2ef..84b22821b86b258a8a3ca2ea07feed314a58a7f2 100644 --- a/port/taslock.c +++ b/port/taslock.c @@ -8,14 +8,26 @@ void lock(Lock *l) { - if(tas(&l->key) == 0) + int i; + ulong pc; + + pc = getcallerpc(l); + + if(tas(&l->key) == 0){ + l->pc = pc; return; + } for(;;){ + i = 0; while(l->key) - ; - if(tas(&l->key) == 0) + if(i++ > 10000000) + panic("lock loop key 0x%lux pc 0x%lux held by pc 0x%lux\n", + l->key, getcallerpc(l), l->pc); + if(tas(&l->key) == 0){ + l->pc = pc; return; + } } } @@ -23,10 +35,14 @@ void ilock(Lock *l) { ulong x; + ulong pc; + + pc = getcallerpc(l); x = splhi(); if(tas(&l->key) == 0){ l->sr = x; + l->pc = pc; return; } @@ -35,6 +51,7 @@ ilock(Lock *l) ; if(tas(&l->key) == 0){ l->sr = x; + l->pc = pc; return; } } @@ -46,6 +63,7 @@ canlock(Lock *l) if(tas(&l->key)) return 0; + l->pc = getcallerpc(l); return 1; }