From c3c8be8705ed5c622ab6931a93b50a68ad56d7b0 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Wed, 9 May 1990 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1990-05-09 --- gnot/proc.c | 27 +++++++++++++++++++++++++++ port/devdk.c | 6 +++++- port/proc.c | 27 +++++++++++++++++++++++++++ port/stream.c | 11 +++++++++++ port/sturp.c | 25 ++++++++++++++++++------- 5 files changed, 88 insertions(+), 8 deletions(-) diff --git a/gnot/proc.c b/gnot/proc.c index b428aaea3b7cbad3d9a1e35b5f7f775b00aa5e5f..7ffa811536b94969f37637f4b370acc0fbb85aa0 100644 --- a/gnot/proc.c +++ b/gnot/proc.c @@ -411,8 +411,35 @@ pexit(char *s, int freemem) } out: if(!freemem){ + /* + * weird thing: keep at most NBROKEN around + */ + #define NBROKEN 4 + static struct{ + Lock; + int n; + Proc *p[NBROKEN]; + }broken; + int b; + + lock(&broken); + if(broken.n == NBROKEN){ + ready(broken.p[0]); + memcpy(&broken.p[0], &broken.p[1], sizeof(Proc*)*(NBROKEN-1)); + --broken.n; + } + broken.p[broken.n++] = c; + unlock(&broken); c->state = Broken; sched(); /* until someone lets us go */ + lock(&broken); + for(b=0; bpgrp); close(u->dot); diff --git a/port/devdk.c b/port/devdk.c index 137cb878e43469ca97e49ebed5dc885cb20b1d5c..ab2405073f74fc54f7104867b8000b38f3f1ff8d 100644 --- a/port/devdk.c +++ b/port/devdk.c @@ -417,7 +417,11 @@ dkoput(Queue *q, Block *bp) bp->rptr[0] = line; bp->rptr[1] = line>>8; - PUTNEXT(dp->wq, bp); + if(QFULL(dp->wq->next)){ + print("dk wq full\n"); + freeb(bp); + } else + PUTNEXT(dp->wq, bp); } /* diff --git a/port/proc.c b/port/proc.c index 31e819395ae26bc4c8fb4072b4f047627aa3e67c..af1b0c519270ce47b09c56312fff5bcded58292e 100644 --- a/port/proc.c +++ b/port/proc.c @@ -410,8 +410,35 @@ pexit(char *s, int freemem) } out: if(!freemem){ + /* + * weird thing: keep at most NBROKEN around + */ + #define NBROKEN 4 + static struct{ + Lock; + int n; + Proc *p[NBROKEN]; + }broken; + int b; + + lock(&broken); + if(broken.n == NBROKEN){ + ready(broken.p[0]); + memcpy(&broken.p[0], &broken.p[1], sizeof(Proc*)*(NBROKEN-1)); + --broken.n; + } + broken.p[broken.n++] = c; + unlock(&broken); c->state = Broken; sched(); /* until someone lets us go */ + lock(&broken); + for(b=0; bpgrp); close(u->dot); diff --git a/port/stream.c b/port/stream.c index 7c16112b653f202c85336e94e5de07d87f71a72c..a0068b560d2a53449a7916c13960eaf6632691a8 100644 --- a/port/stream.c +++ b/port/stream.c @@ -70,7 +70,9 @@ dumpqueues(void) Queue *q; int count; Block *bp; + Bclass *bcp; + print("\n"); for(q = qlist; q < qlist + conf.nqueue; q++, q++){ if(!(q->flag & QINUSE)) continue; @@ -81,6 +83,15 @@ dumpqueues(void) count++; print(" WR count %d len %d\n", count, WR(q)->len); } + print("\n"); + for(bcp=bclass; bcp<&bclass[Nclass-1]; bcp++){ + lock(bcp); + for(count = 0, bp = bcp->first; bp; count++, bp = bp->next) + ; + unlock(bcp); + print("%d blocks of size %d\n", count, bcp->size); + } + print("\n"); } /* diff --git a/port/sturp.c b/port/sturp.c index d54b735ac92f9433f3c452b32e68b08010bfc15a..04ad735358670a4dc8deaff05565ffe1d810c3d1 100644 --- a/port/sturp.c +++ b/port/sturp.c @@ -166,7 +166,7 @@ isflushed(void *a) Urp *up; up = (Urp *)a; - return (up->state&HUNGUP) || (up->unechoed==up->next && up->wq->len==0); + return (up->state&HUNGUP) || (up->unechoed==up->nxb && up->wq->len==0); } static int isdead(void *a) @@ -188,25 +188,36 @@ urpclose(Queue *q) /* * wait for all outstanding messages to drain, tell kernel * process we're closing. + * + * if 2 minutes elapse, give it up */ up->state |= CLOSING; - tsleep(&up->r, isflushed, up, 60*1000); + tsleep(&up->r, isflushed, up, 2*60*1000); /* - * ack all outstanding messages + * kill off the kernel process */ - qlock(&up->xmit); up->state |= HUNGUP; + wakeup(&up->rq->r); + + qlock(&up->xmit); + /* + * ack all outstanding messages + */ i = up->next - 1; if(i < 0) i = 7; rcvack(up, ECHO+i); - qunlock(&up->xmit); /* - * kill off the kernel process + * free all staged but unsent messages */ - wakeup(&up->rq->r); + for(i = 0; i < 7; i++) + if(up->xb[i]){ + freeb(up->xb[i]); + up->xb[i] = 0; + } + qunlock(&up->xmit); if(up->kstarted == 0) up->state = 0;