From 0b0146825b4e205b913bc73420f44c654d562fd5 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Tue, 19 Jun 1990 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1990-06-19 --- gnot/devcons.c | 2 +- gnot/devincon.c | 8 ++------ gnot/devmnt.c | 31 ++++++++++++++----------------- gnot/lock.c | 3 ++- gnot/proc.c | 1 + gnot/sysproc.c | 2 -- gnot/trap.c | 4 ++++ port/devmnt.c | 38 ++++++++++++++++++-------------------- port/proc.c | 1 + port/sysproc.c | 2 -- power/trap.c | 4 ++++ 11 files changed, 47 insertions(+), 49 deletions(-) diff --git a/gnot/devcons.c b/gnot/devcons.c index 0dbecd6d3abf18b67165f64808d319c99ff0b3e0..157e4cbc02378b4b7a7017f4deaf1dfc9c7ba056 100644 --- a/gnot/devcons.c +++ b/gnot/devcons.c @@ -377,7 +377,7 @@ conscreate(Chan *c, char *name, int omode, ulong perm) void consclose(Chan *c) { - if(c->qid == Qrcons) + if(c->qid==Qrcons && (c->flag&COPEN)) decref(&raw); } diff --git a/gnot/devincon.c b/gnot/devincon.c index 415d624735de750b3b457d23bef778d2d89a80f1..902a9ed395db055e5a6145b071df1cd966105fcd 100644 --- a/gnot/devincon.c +++ b/gnot/devincon.c @@ -783,14 +783,10 @@ inconintr(Ureg *ur) /* check for exceptional conditions */ if(status&(OVERFLOW|CRC_ERROR)){ - if(status&OVERFLOW){ - screenputc('^'); + if(status&OVERFLOW) ip->overflow++; - } - if(status&CRC_ERROR){ - screenputc('+'); + if(status&CRC_ERROR) ip->crc++; - } } /* see if it died underneath us */ diff --git a/gnot/devmnt.c b/gnot/devmnt.c index 545c56a74dbd936326bfd5bdd3376655c1c65595..18018b9c196ad1df3fcbb95c62f2bba97cf60557 100644 --- a/gnot/devmnt.c +++ b/gnot/devmnt.c @@ -167,7 +167,6 @@ mqfree(MntQ *mq) lock(mq); if(--mq->ref == 0){ -print("mqfree %lux %lux\n", mq->reader, mq->writer); msg = mq->msg; mq->msg = 0; lock(&mntqalloc); @@ -675,16 +674,16 @@ void mntxmit(Mnt *m, Mnthdr *mh) { ulong n; - Mntbuf *mbr, *mbw; + Mntbuf *mbw; Mnthdr *w, *ow; Chan *mntpt; MntQ *q; int qlocked; - mbr = mballoc(); + mh->mbr = mballoc(); mbw = mballoc(); if(waserror()){ - mbfree(mbr); + mbfree(mh->mbr); mbfree(mbw); nexterror(); } @@ -713,11 +712,11 @@ mntxmit(Mnt *m, Mnthdr *mh) /* * Read response */ - n = (*devtab[q->msg->type].read)(q->msg, mbr->buf, BUFSIZE); + n = (*devtab[q->msg->type].read)(q->msg, mh->mbr->buf, BUFSIZE); mqfree(q); poperror(); - if(convM2S(mbr->buf, &mh->rhdr, n) == 0){ + if(convM2S(mh->mbr->buf, &mh->rhdr, n) == 0){ print("format error in mntxmit\n"); error(0, Ebadmsg); } @@ -745,7 +744,7 @@ mntxmit(Mnt *m, Mnthdr *mh) */ if(mh->thdr.type == Tread) memcpy(mh->thdr.data, mh->rhdr.data, mh->rhdr.count); - mbfree(mbr); + mbfree(mh->mbr); mbfree(mbw); poperror(); return; @@ -770,9 +769,9 @@ mntxmit(Mnt *m, Mnthdr *mh) Read: qunlock(q); qlocked = 0; - n = (*devtab[q->msg->type].read)(q->msg, mbr->buf, BUFSIZE); - if(convM2S(mbr->buf, &mh->rhdr, n) == 0){ - print("%lux %lux %lux %d format error in mntxmit %s\n", u->p, q->reader, q->writer, n, u->p->text); + n = (*devtab[q->msg->type].read)(q->msg, mh->mbr->buf, BUFSIZE); + if(convM2S(mh->mbr->buf, &mh->rhdr, n) == 0){ + print("format error in mntxmit\n"); mnterrdequeue(q, mh); error(0, Ebadmsg); } @@ -796,13 +795,13 @@ mntxmit(Mnt *m, Mnthdr *mh) /* * Hand response to correct recipient */ -if(q->writer == 0) print("response with empty queue %d %d %d: %d %d\n", mh->rhdr.type, mh->rhdr.err, mh->rhdr.fid, mh->thdr.type, mh->thdr.fid); + if(q->writer==0) print("response with empty queue\n"); for(ow=0,w=q->writer; w; ow=w,w=w->next) if(mh->rhdr.fid == w->thdr.fid && mh->rhdr.type == w->thdr.type+1){ Mntbuf *t; - t = mbr; - mbr = w->mbr; + t = mh->mbr; + mh->mbr = w->mbr; w->mbr = t; memcpy(&w->rhdr, &mh->rhdr, sizeof mh->rhdr); /* take recipient from queue */ @@ -815,7 +814,6 @@ if(q->writer == 0) print("response with empty queue %d %d %d: %d %d\n", mh->rhdr } goto Read; }else{ - mh->mbr = mbr; mh->p = u->p; /* put self in queue */ mh->next = q->writer; @@ -823,7 +821,7 @@ if(q->writer == 0) print("response with empty queue %d %d %d: %d %d\n", mh->rhdr qunlock(q); qlocked = 0; if(waserror()){ /* interrupted sleep */ - print("%lux interrupted i/o %d %d\n", u->p, mh->thdr.type, mh->thdr.fid); + print("interrupted i/o\n"); mnterrdequeue(q, mh); nexterror(); } @@ -833,7 +831,6 @@ if(q->writer == 0) print("response with empty queue %d %d %d: %d %d\n", mh->rhdr qlocked = 1; if(q->reader == u->p) /* i got promoted */ goto Read; - mbr = mh->mbr; /* pick up my buffer */ qunlock(q); qlocked = 0; goto Respond; @@ -853,7 +850,7 @@ if(q->writer == 0) print("response with empty queue %d %d %d: %d %d\n", mh->rhdr */ if(mh->thdr.type == Tread) memcpy(mh->thdr.data, mh->rhdr.data, mh->rhdr.count); - mbfree(mbr); + mbfree(mh->mbr); mbfree(mbw); poperror(); } diff --git a/gnot/lock.c b/gnot/lock.c index 782cd6ffe43cea8e3edd12dd9a61b72ef64e89a7..f8d5067fd9239dd6817f31b55a4c99eed73bf5c6 100644 --- a/gnot/lock.c +++ b/gnot/lock.c @@ -35,7 +35,8 @@ lock(Lock *l) return; } l->key = 0; - panic("lock loop %lux pc %lux held by pc %lux\n", l, ((ulong*)&i)[PCOFF], l->pc); +dumpstack(); + panic("lock loop %lux pc %lux held by pc %lux\n", l, ((ulong*)&l)[PCOFF], l->pc); } int diff --git a/gnot/proc.c b/gnot/proc.c index 515bb9a36e8888534070068ec609ae799e5f93a6..845b0ea59a50adf9ba9366d4d43557a069a42448 100644 --- a/gnot/proc.c +++ b/gnot/proc.c @@ -184,6 +184,7 @@ loop: print("no procs\n"); if(u == 0) panic("newproc"); + u->p->state = Wakeme; alarm(1000, wakeme, u->p); sched(); goto loop; diff --git a/gnot/sysproc.c b/gnot/sysproc.c index 091ac437786e40a5270f1e62a9e7e3ea8af6da26..50d9e0371545386110618b989451a6e4847d4c6c 100644 --- a/gnot/sysproc.c +++ b/gnot/sysproc.c @@ -404,8 +404,6 @@ return0(void *a) long syssleep(ulong *arg) { - int ms; - tsleep(&u->p->sleep, return0, 0, arg[0]); return 0; } diff --git a/gnot/trap.c b/gnot/trap.c index 47a1340c04ff6f0b24e881dc42107df6744bd9c2..d03e903e77f8504908dcc707823b021937bb6a0e 100644 --- a/gnot/trap.c +++ b/gnot/trap.c @@ -186,6 +186,10 @@ noted(Ureg **urp) { #ifdef asdfasdf lock(&u->p->debug); + if(!u->notified){ + unlock(&u->p->debug); + return; + } u->notified = 0; memcpy(*urp, u->ureg, sizeof(Ureg)); unlock(&u->p->debug); diff --git a/port/devmnt.c b/port/devmnt.c index 9709559dad2c8166a84bffde646bc97d63c4c11c..18018b9c196ad1df3fcbb95c62f2bba97cf60557 100644 --- a/port/devmnt.c +++ b/port/devmnt.c @@ -65,6 +65,7 @@ struct struct { Lock; + QLock; MntQ *arena; MntQ *free; }mntqalloc; @@ -141,7 +142,7 @@ mhfree(Mnthdr *mh) } MntQ* -mqalloc(Chan *msg) /* mntqalloc is locked */ +mqalloc(Chan *msg) /* mntqalloc is qlocked */ { MntQ *q; @@ -166,7 +167,6 @@ mqfree(MntQ *mq) lock(mq); if(--mq->ref == 0){ -print("mqfree %lux %lux\n", mq->reader, mq->writer); msg = mq->msg; mq->msg = 0; lock(&mntqalloc); @@ -271,7 +271,7 @@ mntattach(char *spec) * Look for queue to same msg channel */ q = mntqalloc.arena; - lock(&mntqalloc); + qlock(&mntqalloc); for(i=0; imsg==cm){ lock(q); @@ -286,7 +286,7 @@ mntattach(char *spec) m->q = mqalloc(cm); out: - unlock(&mntqalloc); + qunlock(&mntqalloc); mh = mhalloc(); if(waserror()){ mhfree(mh); @@ -674,16 +674,16 @@ void mntxmit(Mnt *m, Mnthdr *mh) { ulong n; - Mntbuf *mbr, *mbw; + Mntbuf *mbw; Mnthdr *w, *ow; Chan *mntpt; MntQ *q; int qlocked; - mbr = mballoc(); + mh->mbr = mballoc(); mbw = mballoc(); if(waserror()){ - mbfree(mbr); + mbfree(mh->mbr); mbfree(mbw); nexterror(); } @@ -712,11 +712,11 @@ mntxmit(Mnt *m, Mnthdr *mh) /* * Read response */ - n = (*devtab[q->msg->type].read)(q->msg, mbr->buf, BUFSIZE); + n = (*devtab[q->msg->type].read)(q->msg, mh->mbr->buf, BUFSIZE); mqfree(q); poperror(); - if(convM2S(mbr->buf, &mh->rhdr, n) == 0){ + if(convM2S(mh->mbr->buf, &mh->rhdr, n) == 0){ print("format error in mntxmit\n"); error(0, Ebadmsg); } @@ -744,7 +744,7 @@ mntxmit(Mnt *m, Mnthdr *mh) */ if(mh->thdr.type == Tread) memcpy(mh->thdr.data, mh->rhdr.data, mh->rhdr.count); - mbfree(mbr); + mbfree(mh->mbr); mbfree(mbw); poperror(); return; @@ -769,9 +769,9 @@ mntxmit(Mnt *m, Mnthdr *mh) Read: qunlock(q); qlocked = 0; - n = (*devtab[q->msg->type].read)(q->msg, mbr->buf, BUFSIZE); - if(convM2S(mbr->buf, &mh->rhdr, n) == 0){ - print("%lux %lux %lux %d format error in mntxmit %s\n", u->p, q->reader, q->writer, n, u->p->text); + n = (*devtab[q->msg->type].read)(q->msg, mh->mbr->buf, BUFSIZE); + if(convM2S(mh->mbr->buf, &mh->rhdr, n) == 0){ + print("format error in mntxmit\n"); mnterrdequeue(q, mh); error(0, Ebadmsg); } @@ -795,13 +795,13 @@ mntxmit(Mnt *m, Mnthdr *mh) /* * Hand response to correct recipient */ -if(q->writer == 0) print("response with empty queue %d %d %d: %d %d\n", mh->rhdr.type, mh->rhdr.err, mh->rhdr.fid, mh->thdr.type, mh->thdr.fid); + if(q->writer==0) print("response with empty queue\n"); for(ow=0,w=q->writer; w; ow=w,w=w->next) if(mh->rhdr.fid == w->thdr.fid && mh->rhdr.type == w->thdr.type+1){ Mntbuf *t; - t = mbr; - mbr = w->mbr; + t = mh->mbr; + mh->mbr = w->mbr; w->mbr = t; memcpy(&w->rhdr, &mh->rhdr, sizeof mh->rhdr); /* take recipient from queue */ @@ -814,7 +814,6 @@ if(q->writer == 0) print("response with empty queue %d %d %d: %d %d\n", mh->rhdr } goto Read; }else{ - mh->mbr = mbr; mh->p = u->p; /* put self in queue */ mh->next = q->writer; @@ -822,7 +821,7 @@ if(q->writer == 0) print("response with empty queue %d %d %d: %d %d\n", mh->rhdr qunlock(q); qlocked = 0; if(waserror()){ /* interrupted sleep */ - print("%lux interrupted i/o %d %d\n", u->p, mh->thdr.type, mh->thdr.fid); + print("interrupted i/o\n"); mnterrdequeue(q, mh); nexterror(); } @@ -832,7 +831,6 @@ if(q->writer == 0) print("response with empty queue %d %d %d: %d %d\n", mh->rhdr qlocked = 1; if(q->reader == u->p) /* i got promoted */ goto Read; - mbr = mh->mbr; /* pick up my buffer */ qunlock(q); qlocked = 0; goto Respond; @@ -852,7 +850,7 @@ if(q->writer == 0) print("response with empty queue %d %d %d: %d %d\n", mh->rhdr */ if(mh->thdr.type == Tread) memcpy(mh->thdr.data, mh->rhdr.data, mh->rhdr.count); - mbfree(mbr); + mbfree(mh->mbr); mbfree(mbw); poperror(); } diff --git a/port/proc.c b/port/proc.c index 06fe95acd5555f7f63a1db936618057e4f79c516..d7e2d4c7685c8ee5fef8597b8f3c0ce118da09d1 100644 --- a/port/proc.c +++ b/port/proc.c @@ -184,6 +184,7 @@ loop: print("no procs\n"); if(u == 0) panic("newproc"); + u->p->state = Wakeme; alarm(1000, wakeme, u->p); sched(); goto loop; diff --git a/port/sysproc.c b/port/sysproc.c index 6c5af9cf8f6cb1d41270967c8a5e3ffc560428c7..1760edf1744626d5bcc7d48cff5de579833ecc16 100644 --- a/port/sysproc.c +++ b/port/sysproc.c @@ -404,8 +404,6 @@ return0(void *a) long syssleep(ulong *arg) { - int ms; - tsleep(&u->p->sleep, return0, 0, arg[0]); return 0; } diff --git a/power/trap.c b/power/trap.c index ec39d29921e7534febfc7cf60821ccaee31f91d4..436e234ab73378763eb54f2fc3cc9603b926bde4 100644 --- a/power/trap.c +++ b/power/trap.c @@ -361,6 +361,10 @@ void noted(Ureg **urp) { lock(&u->p->debug); + if(!u->notified){ + unlock(&u->p->debug); + return; + } u->notified = 0; memcpy(*urp, u->ureg, sizeof(Ureg)); unlock(&u->p->debug);