--- tcl84.orig/generic/tclIO.c	2008-04-02 14:18:30.000000000 -0800
+++ tcl84/generic/tclIO.c	2008-04-02 14:26:58.000000000 -0800
@@ -7835,22 +7835,32 @@
 	    goto writeError;
 	}
 	
-	/*
-	 * Read up to bufSize bytes.
-	 */
+	if (cmdPtr && (mask == 0)) {
+	    /*
+	     * In async mode, we skip reading synchronously and fake an
+	     * underflow instead to prime the readable fileevent.
+	     */
 
-	if ((csPtr->toRead == -1) || (csPtr->toRead > csPtr->bufSize)) {
-	    sizeb = csPtr->bufSize;
+	    size      = 0;
+	    underflow = 1;
 	} else {
-	    sizeb = csPtr->toRead;
-	}
+	    /*
+	     * Read up to bufSize bytes.
+	     */
 
-	if (inBinary || sameEncoding) {
-	    size = DoRead(inStatePtr->topChanPtr, csPtr->buffer, sizeb);
-	} else {
-	    size = DoReadChars(inStatePtr->topChanPtr, bufObj, sizeb, 0 /* No append */);
+	    if ((csPtr->toRead == -1) || (csPtr->toRead > csPtr->bufSize)) {
+	        sizeb = csPtr->bufSize;
+	    } else {
+	        sizeb = csPtr->toRead;
+	    }
+
+	    if (inBinary || sameEncoding) {
+	        size = DoRead(inStatePtr->topChanPtr, csPtr->buffer, sizeb);
+	    } else {
+	        size = DoReadChars(inStatePtr->topChanPtr, bufObj, sizeb, 0 /* No append */);
+	    }
+	    underflow = (size >= 0) && (size < sizeb);	/* input underflow */
 	}
-	underflow = (size >= 0) && (size < sizeb);	/* input underflow */
 
 	if (size < 0) {
 	    readError:
