From 07e4a9fe3a0f299e5758f1e3a2efda11d2d855c1 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Mon, 9 Dec 1991 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1991-12-09 --- gnot/devincon.c | 8 ++++++++ power/devbit3.c | 41 +++++++++++++++++++++++++++++++++-------- 2 files changed, 41 insertions(+), 8 deletions(-) diff --git a/gnot/devincon.c b/gnot/devincon.c index aede0684fbf1f1ea049897d1f58d885250f09906..f277cb4845dc6820d3e3843cab7685cbb99f9bc6 100644 --- a/gnot/devincon.c +++ b/gnot/devincon.c @@ -809,6 +809,10 @@ rdpackets(Incon *ip) if(p - bp->rptr > 3){ bp->wptr = p; bp = nextin(ip, 0); + if(bp==0){ + flushfifo(ip->dev); + return; + } p = bp->wptr; } ip->chan = c; @@ -829,6 +833,10 @@ rdpackets(Incon *ip) */ bp->wptr = p; bp = nextin(ip, c); + if(bp==0){ + flushfifo(ip->dev); + return; + } p = bp->wptr; } else { /* end of packet */ diff --git a/power/devbit3.c b/power/devbit3.c index 3ab0e93036b6d7ae1f7e18e5d7b28c09175e446b..f2f049c38d934172a54c043b7cd9554b50bf5bee 100644 --- a/power/devbit3.c +++ b/power/devbit3.c @@ -82,6 +82,7 @@ bit3walk(Chan *c, char *name) void bit3stat(Chan *c, char *dp) { + USED(c, dp); print("bit3stat\n"); error(Egreg); } @@ -111,12 +112,14 @@ bit3open(Chan *c, int omode) void bit3create(Chan *c, char *name, int omode, ulong perm) { + USED(c, name, omode, perm); error(Eperm); } void bit3close(Chan *c) { + USED(c); qlock(&bit3); bit3.open = 0; qunlock(&bit3); @@ -135,6 +138,7 @@ bit3read(Chan *c, void *buf, long n, ulong offset) { Bit3msg *bp; int docpy; + long i; switch(c->qid.path){ case 1: @@ -149,9 +153,19 @@ bit3read(Chan *c, void *buf, long n, ulong offset) qlock(&bit3); bit3send(bp, READ, buf, n); qunlock(&bit3); - do + for(i=0; i<10*1000*1000; i++){ n = bp->rcount; - while(n == 0); + if(n != 0) + return n; + if(i > 5*1000*1000){ + u->p->psstate = "Bit3wait"; + while(waserror()) + ; + tsleep(&u->p->sleep, return0, 0, 1000); + poperror(); + } + } + pexit("Suicide", 0); }else{ /* * use bit3 buffer. lock the buffer till the reply @@ -162,13 +176,24 @@ bit3read(Chan *c, void *buf, long n, ulong offset) qlock(&bit3); bit3send(bp, READ, bit3.buf, n); qunlock(&bit3); - do + for(i=0; i<10*1000*1000; i++){ n = bp->rcount; - while(n == 0); - memmove(buf, bit3.buf, n); + if(n != 0){ + memmove(buf, bit3.buf, n); + qunlock(&bit3.buflock); + return n; + } + if(i > 5*1000*1000){ + u->p->psstate = "Bit3wait"; + while(waserror()) + ; + tsleep(&u->p->sleep, return0, 0, 1000); + poperror(); + } + } qunlock(&bit3.buflock); + pexit("Suicide", 0); } - return n; } error(Egreg); return 0; @@ -191,13 +216,11 @@ bit3write(Chan *c, void *buf, long n, ulong offset) }else{ bp = &((User*)(u->p->upage->pa|KZERO))->ubit3; qlock(&bit3.buflock); - qlock(&bit3); memmove(bit3.buf, buf, n); bit3send(bp, WRITE, bit3.buf, n); do; while(*BIT3ADDR); qunlock(&bit3); - qunlock(&bit3.buflock); } return n; @@ -209,11 +232,13 @@ bit3write(Chan *c, void *buf, long n, ulong offset) void bit3remove(Chan *c) { + USED(c); error(Eperm); } void bit3wstat(Chan *c, char *dp) { + USED(c, dp); error(Eperm); }