bob@dhw68k.cts.com (Bob Best) (10/30/88)
I was having serious problems with the serial driver when separate processes were attempting to write simultaneously on /dev/tty1. For example, the following shell command was certain to crash: dis88 foo | less The problem was that dis88 was sending an error message to stderr regarding symbols not found at the same time that less was attempting to output on stdout. I examined the code for do_write() in tty.c and it seemed that Andy had provided security against just this type of multi-access. Some debugging code finally provided the evidence that testing tp->tty_outleft greater than zero was insufficient. I replaced this line with: if (tp->tty_waiting) { /* if someone else is hanging, give up */ Now everything runs smoothly. There are also some problems when a program that continuously scrolls output is running simultaneously on /dev/tty0 and /dev/tty1. I am not overly concerned about this, since the system would rarely operate this way. However, for the record, when running simultaneously on /dev/tty0 and /dev/tty1, the following program will display about 20 lines and then stop for about 8 seconds on /dev/tty1 while scrolling nonstop on /dev/tty0. This is probably not a bug, but a consequence of the console output routines somehow taking precedence over the rs232 output routines. --------------begin nonstop.c------- /* nonstop.c - test program to continuously scroll output * Hit DEL to kill */ main() { int i=0; while(1) printf("This is number %d\n",++i); } ------------end nonstop.c---------- This is the patch for kernel/tty.c to fix the bug described above: Index: tty.c *** tty.c~ Sat Oct 29 13:18:25 1988 --- tty.c Sat Oct 29 13:20:18 1988 *************** *** 580,586 **** int caller,replyee; /* If the slot is already in use, better return an error than mess it up. */ ! if (tp->tty_outleft > 0) { /* if someone else is hanging, give up */ tty_reply(TASK_REPLY, m_ptr->m_source, m_ptr->PROC_NR, EIO, 0L, 0L); return; } --- 580,586 ---- int caller,replyee; /* If the slot is already in use, better return an error than mess it up. */ ! if (tp->tty_waiting) { /* if someone else is hanging, give up */ tty_reply(TASK_REPLY, m_ptr->m_source, m_ptr->PROC_NR, EIO, 0L, 0L); return; } -- Bob Best uucp: ...{trwrb,hplabs}!felix!dhw68k!bob InterNet: bob@dhw68k.cts.com