Tcl Source Code

Artifact [6d7d022f10]
Login

Artifact 6d7d022f107c46e072169f91283134d9575269d8:

Attachment "tcl-no-bad-tip35-flush.patch" to ticket [1901828fff] added by jenglish 2008-02-27 02:23:11.
Date: Tue Feb 26 11:21:14 PST 2008
Files: unix/tclUnixChan.c
Related: 525783
Bugid: 1901828

--- unix/tclUnixChan.c.no-bad-tip35-flush.old	2008-01-08 11:41:24.000000000 -0800
+++ unix/tclUnixChan.c	2008-02-26 10:51:43.176536344 -0800
@@ -65,22 +65,6 @@
 #   define GETCONTROL(fd, intPtr)	ioctl((fd), TIOCMGET, (intPtr))
 #   define SETCONTROL(fd, intPtr)	ioctl((fd), TIOCMSET, (intPtr))
 
-    /*
-     * TIP #35 introduced a different on exit flush/close behavior that does
-     * not work correctly with standard channels on all systems. The problem
-     * is tcflush throws away waiting channel data. This may be necessary for
-     * true serial channels that may block, but isn't correct in the standard
-     * case. This might be replaced with tcdrain instead, but that can block.
-     * For now, we revert to making this do nothing, and TtyOutputProc being
-     * the same old FileOutputProc. - hobbs [Bug #525783]
-     */
-
-#   define BAD_TIP35_FLUSH 0
-#   if BAD_TIP35_FLUSH
-#	define TTYFLUSH(fd)		tcflush((fd), TCIOFLUSH);
-#   else
-#	define TTYFLUSH(fd)
-#   endif /* BAD_TIP35_FLUSH */
 #   ifdef FIONREAD
 #	define GETREADQUEUE(fd, int)	ioctl((fd), FIONREAD, &(int))
 #   elif defined(FIORDCHK)
@@ -282,10 +266,6 @@
 #endif /* DIRECT_BAUD */
 static FileState *	TtyInit(int fd, int initialize);
 static void		TtyModemStatusStr(int status, Tcl_DString *dsPtr);
-#if BAD_TIP35_FLUSH
-static int		TtyOutputProc(ClientData instanceData,
-			    const char *buf, int toWrite, int *errorCode);
-#endif /* BAD_TIP35_FLUSH */
 static int		TtyParseMode(Tcl_Interp *interp, const char *mode,
 			    int *speedPtr, int *parityPtr, int *dataPtr,
 			    int *stopPtr);
@@ -333,11 +313,7 @@
     TCL_CHANNEL_VERSION_5,	/* v5 channel */
     TtyCloseProc,		/* Close proc. */
     FileInputProc,		/* Input proc. */
-#if BAD_TIP35_FLUSH
-    TtyOutputProc,		/* Output proc. */
-#else /* !BAD_TIP35_FLUSH */
     FileOutputProc,		/* Output proc. */
-#endif /* BAD_TIP35_FLUSH */
     NULL,			/* Seek proc. */
     TtySetOptionProc,		/* Set option proc. */
     TtyGetOptionProc,		/* Get option proc. */
@@ -760,14 +736,6 @@
     ClientData instanceData,	/* Tty state. */
     Tcl_Interp *interp)		/* For error reporting - unused. */
 {
-#if BAD_TIP35_FLUSH
-    TtyState *ttyPtr = (TtyState *) instanceData;
-#endif /* BAD_TIP35_FLUSH */
-
-#ifdef TTYFLUSH
-    TTYFLUSH(ttyPtr->fs.fd);
-#endif /* TTYFLUSH */
-
 #if 0
     /*
      * TIP#35 agreed to remove the unsave so that TCL could be used as a
@@ -786,46 +754,6 @@
     return FileCloseProc(instanceData, interp);
 }
 
-/*
- *----------------------------------------------------------------------
- *
- * TtyOutputProc--
- *
- *	This function is invoked from the generic IO level to write output to
- *	a TTY channel.
- *
- * Results:
- *	The number of bytes written is returned or -1 on error. An output
- *	argument contains a POSIX error code if an error occurred, or zero.
- *
- * Side effects:
- *	Writes output on the output device of the channel if the channel is
- *	not designated to be closed.
- *
- *----------------------------------------------------------------------
- */
-
-#if BAD_TIP35_FLUSH
-static int
-TtyOutputProc(
-    ClientData instanceData,	/* File state. */
-    const char *buf,		/* The data buffer. */
-    int toWrite,		/* How many bytes to write? */
-    int *errorCodePtr)		/* Where to store error code. */
-{
-    if (TclInExit()) {
-	/*
-	 * Do not write data during Tcl exit. Serial port may block preventing
-	 * Tcl from exit.
-	 */
-
-	return toWrite;
-    }
-
-    return FileOutputProc(instanceData, buf, toWrite, errorCodePtr);
-}
-#endif /* BAD_TIP35_FLUSH */
-
 #ifdef USE_TERMIOS
 /*
  *----------------------------------------------------------------------