Ticket UUID: | 894da183c8475264b8070b5b4dbbd6dd72f8dd69 | |||
Title: | In a thread, switch a non-blocking channel to blocking and close == hang | |||
Type: | Bug | Version: | 8.6.4 | |
Submitter: | pooryorick | Created on: | 2015-04-24 18:37:17 | |
Subsystem: | 25. Channel System | Assigned To: | dgp | |
Priority: | 5 Medium | Severity: | Critical | |
Status: | Closed | Last Modified: | 2015-04-30 16:13:39 | |
Resolution: | Fixed | Closed By: | oehhar | |
Closed on: | 2015-04-30 16:13:39 | |||
Description: |
The following script causes Tcl to hang:
Add a call to
| |||
User Comments: |
oehhar added on 2015-04-30 16:13:39:
Fix [453c47d3d9] works for me, thanks ! dgp added on 2015-04-30 13:57:07: Right you are! Will fix soon. oehhar added on 2015-04-30 13:02:01: Thank you for the patch and the test. I have tried this checkin [98d7d3d724], Win 8.1, MS-VC6. For me, the test fails as follows: ---- io-53.4.1 start ==== io-53.4.1 Bug 894da183c8 FAILED ==== Contents of test case: set big bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n variable x for {set x 0} {$x < 12} {incr x} { append big $big } file delete $path(pipe) set f1 [open $path(pipe) w] puts $f1 [list file delete $path(test1)] puts $f1 { puts ready set f [open io-53.4.1 w] fcopy stdin $f -command { set x } vwait x close $f } puts $f1 "close \[[list open $path(test1) w]]" close $f1 set f1 [open "|[list [interpreter] $path(pipe)]" r+] set result [gets $f1] fconfigure $f1 -blocking 0 -buffersize 125000 puts $f1 $big fconfigure $f1 -blocking 1 close $f1 set big {} while {[catch {glob $path(test1)}]} {after 50} file delete $path(test1) set check [file size io-53.4.1] file delete io-53.4.1 set check ---- Result was: 270338 ---- Result should have been (exact matching): 266241 ==== io-53.4.1 FAILED I suppose, this is due to different line ending styles: \n\r on windows and by \n on unix.... dgp added on 2015-04-29 18:17:17: Tidied patches merged to active release branches. dgp added on 2015-04-29 16:35:20: See branch bug-894da183c8 for test and fix demonstrating where the regression regressed. dgp added on 2015-04-28 15:56:46: Regression introduced in http://core.tcl.tk/tcl/info/37bcb4b42d963315 pooryorick added on 2015-04-26 01:18:33: Some experimentation showed that in case of the first example (no [flush $chan]), the contents of In tclIO.c/FlushChannl, the contents of statePtr->curOutPtr were not getting flushed, causing FlushChannel not to call CloseChannel. This fix solves the problem and passes the Tcl test suite:
|