--- mrxvt05b/src/command.c 2006/11/16 20:43:17 198 +++ mrxvt05b/src/command.c 2006/11/16 20:49:41 199 @@ -1774,7 +1774,7 @@ * 2006-08-23 gi1242: O_NDELAY is set here, so we need not worry about * calls to read() blocking. */ - errno = 0; + errno = PVTS(r, page)->gotEIO = 0; n = read( PVTS(r, page)->cmd_fd, PVTS(r, page)->cmdbuf_endp, count ); readErrno = errno; @@ -1807,8 +1807,14 @@ readErrno != EISDIR ); /* See if this process is dead */ - if( readErrno == EIO || readErrno == EINTR ) - rxvt_mark_dead_childs(r); + switch (readErrno) + { + case EIO: + r->gotEIO = PVTS(r, page)->gotEIO = 1; + case EINTR: + rxvt_mark_dead_childs(r); + break; + } /* * 2006-08-31 gi1242: Old code would only break out on EAGAIN or @@ -2104,6 +2110,8 @@ } #endif /* POINTER_BLANK || CURSOR_BLINK || TRANSPARENT */ + quick_timeout |= r->gotEIO; + r->gotEIO = 0; return quick_timeout; } @@ -2345,11 +2353,16 @@ for (i = 0; i <= LTAB(r); i ++) { /* remember to skip held childrens */ - if ( (PVTS(r, i)->hold > 1) ) + if ( PVTS(r, i)->hold > 1 ) { DBG_MSG(2,(stderr," not listen on vt[%d].cmd_fd\n",i)); continue; } + else if ( PVTS(r, i)->gotEIO ) + { + PVTS(r, i)->gotEIO = 0; + continue; + } DBG_MSG(2, (stderr, " listen on vt[%d].cmd_fd = %d\n", i, PVTS(r, i)->cmd_fd));