M port/devns16552.c => port/devns16552.c +4 -0
@@ 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);
M port/portfns.h => port/portfns.h +1 -0
@@ 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*);
M port/qio.c => port/qio.c +27 -1
@@ 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);
+}