mouse@mcgill-vision.UUCP (der Mouse) (08/10/85)
We just started getting netnews, so please forgive if this has been mentioned.... There was a bug in our distribution's `dmf' device driver. (How many of you have dmf cards on your vaxen :-)? Symptom is that some programs (those which use select() to select a tty line for write) will block every 200 or so characters of output and wait until you type something before continuing. More precisely, this bug caused a select() on a dmf terminal line to fail to notice when a write, which was not initially possible, became possible. The change is in /sys/vaxuba/dmf.c (of course), in dmfstart, where a test is made to wake up sleepers when the outq drains below the low water mark. The code wakes up processes blocked in write()s and should, but doesn't, also wake up anyone blocked in a select(). The code we are running appears to work correctly. Here is a diff listing (and after it, a diff -e listing): 516c516,517 < * If output has drained below low water mark, wake up any sleepers. --- > * If there are sleepers, and output has drained below low > * water mark, wake up the sleepers. 518,528c519,522 < if (tp->t_outq.c_cc <= TTLOWAT(tp)) < { if (tp->t_state & TS_ASLEEP) < { tp->t_state &= ~TS_ASLEEP; < wakeup((caddr_t)&tp->t_outq); < } < if (tp->t_wsel) < { selwakeup(tp->t_wsel,tp->t_state&TS_WCOLL); < tp->t_wsel = 0; < tp->t_state &= ~TS_WCOLL; < } < } --- > if ((tp->t_state&TS_ASLEEP) && tp->t_outq.c_cc<=TTLOWAT(tp)) { > tp->t_state &= ~TS_ASLEEP; > wakeup((caddr_t)&tp->t_outq); > } Here's the diff -e listing: 519,522c if (tp->t_outq.c_cc <= TTLOWAT(tp)) { if (tp->t_state & TS_ASLEEP) { tp->t_state &= ~TS_ASLEEP; wakeup((caddr_t)&tp->t_outq); } if (tp->t_wsel) { selwakeup(tp->t_wsel,tp->t_state&TS_WCOLL); tp->t_wsel = 0; tp->t_state &= ~TS_WCOLL; } } . 516,517c * If output has drained below low water mark, wake up any sleepers. . der Mouse Hacker and general troublemaker CVaRL, McGill University Hacker: One responsible for destroying / Wizard: One responsible for recovering it afterward -- der Mouse Hacker and general troublemaker CVaRL, McGill University Hacker: One responsible for destroying / Wizard: One responsible for recovering it afterward