From 879626d0e94fd4310be02aa0a9e962beee4a065f Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Tue, 27 Sep 1994 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1994-09-27 --- port/devns16552.c | 4 ++++ port/portfns.h | 1 + port/qio.c | 28 +++++++++++++++++++++++++++- 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/port/devns16552.c b/port/devns16552.c index 3425bad367a058c08a0412e104c3a0183b8bb22c..a6f5975d09f555acef299541a44ccb12de62d27a 100644 --- a/port/devns16552.c +++ b/port/devns16552.c @@ -830,6 +830,10 @@ ns16552ctl(Uart *p, char *cmd) case 'd': ns16552dtr(p, n); break; + case 'f': + case 'F': + qflush(p->oq); + break; case 'H': case 'h': qhangup(p->iq); diff --git a/port/portfns.h b/port/portfns.h index 040f21e348ba9a660e1dbe1c6846855026d642f7..dfbea994803a6226878501caa2d958a262437b9c 100644 --- a/port/portfns.h +++ b/port/portfns.h @@ -192,6 +192,7 @@ ulong pwait(Waitmsg*); int qcanread(Queue*); void qclose(Queue*); int qconsume(Queue*, void*, int); +void qflush(Queue*); void qhangup(Queue*); void qinit(void); int qlen(Queue*); diff --git a/port/qio.c b/port/qio.c index 264307c837a0fb951b636e47f4a21fb2df3d698d..09e8737777c93ec2cb77230bb8465dfd599f55f4 100644 --- a/port/qio.c +++ b/port/qio.c @@ -609,6 +609,7 @@ qclose(Queue *q) bfirst = q->bfirst; q->bfirst = 0; q->len = 0; + q->noblock = 0; iunlock(q); /* free queued blocks */ @@ -649,7 +650,6 @@ qreopen(Queue *q) q->state &= ~Qclosed; q->state |= Qstarve; q->eof = 0; - q->noblock = 0; q->limit = q->inilim; } @@ -702,3 +702,29 @@ qnoblock(Queue *q, int onoff) { q->noblock = onoff; } + +/* + * flush the output queue + */ +void +qflush(Queue *q) +{ + Block *b, *bfirst; + + /* mark it */ + ilock(q); + bfirst = q->bfirst; + q->bfirst = 0; + q->len = 0; + iunlock(q); + + /* free queued blocks */ + while(bfirst){ + b = bfirst->next; + freeb(bfirst); + bfirst = b; + } + + /* wake up readers/writers */ + wakeup(&q->wr); +}