From 0a6f3cd428b509bd0db26c5d211340371a3e7c02 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Mon, 30 Oct 1995 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1995-10-30 --- carrera/dat.h | 1 + pc/dat.h | 1 + port/devcons.c | 3 +++ port/portfns.h | 2 ++ port/proc.c | 46 +++++++++++++++++++++++++++++++++------------- port/taslock.c | 26 +++++++++++++++++++++----- power/dat.h | 1 + 7 files changed, 62 insertions(+), 18 deletions(-) diff --git a/carrera/dat.h b/carrera/dat.h index 8750f7c38ac11e185acc9d3b0decee6f8e35476c..e4dffff10d14c50ece09aaf70e20da9462bb8885 100644 --- a/carrera/dat.h +++ b/carrera/dat.h @@ -26,6 +26,7 @@ struct Lock ulong key; /* semaphore (non-zero = locked) */ ulong sr; ulong pc; + ulong pid; }; struct Label diff --git a/pc/dat.h b/pc/dat.h index 1cadf39903c7f8331403f0230c1db28c472a5255..5a3379778a249b9247dcb3cd7a669d122f7f5f84 100644 --- a/pc/dat.h +++ b/pc/dat.h @@ -29,6 +29,7 @@ struct Lock ulong key; ulong sr; ulong pc; + ulong pid; }; struct Label diff --git a/port/devcons.c b/port/devcons.c index 5d4c1bab01a68a8f6151cf440a36969d3b1181e6..10556957c9e7b6160b03fd0c30db06d3c5e4deb3 100644 --- a/port/devcons.c +++ b/port/devcons.c @@ -217,6 +217,9 @@ echo(Rune r, char *buf, int n) case 'p': procdump(); return; + case 'q': + scheddump(); + break; case 'k': if(!cpuserver) killbig(); diff --git a/port/portfns.h b/port/portfns.h index 6bd92baaa292197886598840cd3cb4db4d020f53..154537cd50c597d006722a906109c429f83c47fa 100644 --- a/port/portfns.h +++ b/port/portfns.h @@ -62,6 +62,7 @@ Chan* devopen(Chan*, int, Dirtab*, int, Devgen*); void devstat(Chan*, char*, Dirtab*, int, Devgen*); int devwalk(Chan*, char*, Dirtab*, int, Devgen*); Chan* domount(Chan*); +void dumpaproc(Proc*); void dumpqueues(void); void dumpregs(Ureg*); void dumpstack(void); @@ -237,6 +238,7 @@ void sccclock(void); int sccintr(void); void sccsetup(void*, ulong, int); void sched(void); +void scheddump(void); void schedinit(void); int screenbits(void); #define scsialloc(n) mallocz((n)+512, 0) diff --git a/port/proc.c b/port/proc.c index 13c8e8c5ea8de8888a6c4882bc0420407c713116..cbfcac23aafedcbd84c491a0a50765dbfec945fc 100644 --- a/port/proc.c +++ b/port/proc.c @@ -784,14 +784,32 @@ proctab(int i) return &procalloc.arena[i]; } +void +dumpaproc(Proc *p) +{ + ulong bss; + char *s; + + if(p == 0) + return; + + bss = 0; + if(p->seg[BSEG]) + bss = p->seg[BSEG]->top; + + s = p->psstate; + if(s == 0) + s = "kproc"; + print("%3d:%10s pc %8lux dbgpc %8lux %8s (%s) ut %ld st %ld bss %lux\n", + p->pid, p->text, p->pc, dbgpc(p), s, statename[p->state], + p->time[0], p->time[1], bss, p->priority); +} + void procdump(void) { int i; - char *s; Proc *p; - ulong bss; - Schedq *rq; if(up) print("up %d\n", up->pid); @@ -801,17 +819,18 @@ procdump(void) p = &procalloc.arena[i]; if(p->state == Dead) continue; - bss = 0; - if(p->seg[BSEG]) - bss = p->seg[BSEG]->top; - - s = p->psstate; - if(s == 0) - s = "kproc"; - print("%3d:%10s pc %8lux dbgpc %8lux %8s (%s) ut %ld st %ld bss %lux\n", - p->pid, p->text, p->pc, dbgpc(p), s, statename[p->state], - p->time[0], p->time[1], bss); + + dumpaproc(p); + delay(150); } +} + +void +scheddump(void) +{ + Proc *p; + Schedq *rq; + for(rq = &runq[Nrq-1]; rq >= runq; rq--){ if(rq->head == 0) continue; @@ -820,6 +839,7 @@ procdump(void) print(" %d(%d, %d)", p->pid, m->ticks - p->readytime, m->ticks - p->movetime); print("\n"); + delay(150); } print("nrdy %d\n", nrdy); } diff --git a/port/taslock.c b/port/taslock.c index 553e7ecffb4783ac1f0ab8694e4b0610e6a5dc3b..f0b2598273fca18fb949c62cf115fa737af456e7 100644 --- a/port/taslock.c +++ b/port/taslock.c @@ -5,27 +5,39 @@ #include "fns.h" #include "../port/error.h" +void +lockloop(Lock *l, ulong pc) +{ + print("lock loop key 0x%lux pc 0x%lux held by pc 0x%lux proc %d\n", + l->key, pc, l->pc, l->pid); + dumpaproc(up); +} + void lock(Lock *l) { int i; - ulong pc; + ulong pc, pid; pc = getcallerpc(l); + pid = up ? up->pid : 0; if(tas(&l->key) == 0){ l->pc = pc; + l->pid = pid; return; } for(;;){ i = 0; while(l->key) - if(i++ > 100000000) - panic("lock loop key 0x%lux pc 0x%lux held by pc 0x%lux pl 0x%lux\n", - l->key, pc, l->pc, splhi()); + if(i++ > 100000000){ + i = 0; + lockloop(l, pc); + } if(tas(&l->key) == 0){ l->pc = pc; + l->pid = pid; return; } } @@ -35,14 +47,16 @@ void ilock(Lock *l) { ulong x; - ulong pc; + ulong pc, pid; pc = getcallerpc(l); + pid = up ? up->pid : 0; x = splhi(); if(tas(&l->key) == 0){ l->sr = x; l->pc = pc; + l->pid = pid; return; } @@ -52,6 +66,7 @@ ilock(Lock *l) if(tas(&l->key) == 0){ l->sr = x; l->pc = pc; + l->pid = pid; return; } } @@ -64,6 +79,7 @@ canlock(Lock *l) return 0; l->pc = getcallerpc(l); + l->pid = up ? up->pid : 0; return 1; } diff --git a/power/dat.h b/power/dat.h index 88c11a2acef936894bceab4e90fd690204b821a5..1f00ead903a08150e38a5d8012e9b49a58708cc5 100644 --- a/power/dat.h +++ b/power/dat.h @@ -25,6 +25,7 @@ struct Lock int val; ulong pc; ulong sr; + ulong pid; }; struct Label