diff options
| author | dgp <dgp@users.sourceforge.net> | 2014-06-03 17:32:33 (GMT) |
|---|---|---|
| committer | dgp <dgp@users.sourceforge.net> | 2014-06-03 17:32:33 (GMT) |
| commit | 93b55b0dc4675e115123573925a07568dc0a952c (patch) | |
| tree | 48debe3a1e9df42db2e038d0180766f3b4d9c154 /generic/tclIO.c | |
| parent | 312e71eff44c59b48e01cab1718d8ab2b426702c (diff) | |
| parent | 6c7e545b80e6ce72b0bf64749efedcd61153043a (diff) | |
| download | tcl-93b55b0dc4675e115123573925a07568dc0a952c.zip tcl-93b55b0dc4675e115123573925a07568dc0a952c.tar.gz tcl-93b55b0dc4675e115123573925a07568dc0a952c.tar.bz2 | |
Backport I/O core fixes made known by async socket work on trunk.
Diffstat (limited to 'generic/tclIO.c')
| -rw-r--r-- | generic/tclIO.c | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/generic/tclIO.c b/generic/tclIO.c index 0716074..ed94bfe 100644 --- a/generic/tclIO.c +++ b/generic/tclIO.c @@ -3205,11 +3205,18 @@ Tcl_Close( stickyError = 0; - if ((statePtr->encoding != NULL) - && !(statePtr->outputEncodingFlags & TCL_ENCODING_START) - && (CheckChannelErrors(statePtr, TCL_WRITABLE) == 0)) { - statePtr->outputEncodingFlags |= TCL_ENCODING_END; - if (WriteChars(chanPtr, "", 0) < 0) { + if (GotFlag(statePtr, TCL_WRITABLE) && (statePtr->encoding != NULL) + && !(statePtr->outputEncodingFlags & TCL_ENCODING_START)) { + + int code = CheckChannelErrors(statePtr, TCL_WRITABLE); + + if (code == 0) { + statePtr->outputEncodingFlags |= TCL_ENCODING_END; + code = WriteChars(chanPtr, "", 0); + statePtr->outputEncodingFlags &= ~TCL_ENCODING_END; + statePtr->outputEncodingFlags |= TCL_ENCODING_START; + } + if (code < 0) { stickyError = Tcl_GetErrno(); } @@ -7639,8 +7646,9 @@ Tcl_NotifyChannel( */ if (GotFlag(statePtr, BG_FLUSH_SCHEDULED) && (mask & TCL_WRITABLE)) { - FlushChannel(NULL, chanPtr, 1); - mask &= ~TCL_WRITABLE; + if (0 == FlushChannel(NULL, chanPtr, 1)) { + mask &= ~TCL_WRITABLE; + } } /* |
