| Ticket UUID: | 1975182bddc84f6601f60b0acf2f326eae10316 | |||
| Title: | tcl::chan::cat - syntax error and bad behavior with fileevents | |||
| Type: | Bug | Version: | 1.19 | |
| Submitter: | anonymous | Created on: | 2019-03-12 23:15:43 | |
| Subsystem: | tcl :: chan :: * | Assigned To: | aku | |
| Priority: | 5 Medium | Severity: | Critical | |
| Status: | Closed | Last Modified: | 2019-04-15 19:23:34 | |
| Resolution: | Accepted | Closed By: | aku | |
| Closed on: | 2019-04-15 19:23:34 | |||
| Description: |
tcl::cache::cat 1.0.3 has a critical bug, if an event handler has been registered on the reflected channel.
By running the following code (interactively from wish)
-----------------------------
package tcl::chan::chan
package tcl::chan::string
# setup 2 simple data-channels.
# Here we use two simple string-channels but we could also [open] two simple files.
set fd1 [tcl::chan::string "ABCDE..XYZ"]
set fd2 [tcl::chan::string "0123456789"]
# setup a cat'enated channel
set ch [tcl::chan::cat $fd1 $fd2]
# register a file handler printing the contents of the cat'enated channel
# by reading 4 bytes at time -- NOTE: ch is a global variable
# expected result is
# <<ABCD>>
# <<E..X>>
# <<YZ01>>
# <<2345>>
# <<6789>>
# <<>>
chan event $ch readable {
if { [eof $ch] } { close $ch } else { puts "<<[read $ch 4]>>" }
}
# ! NOTHING happens !!!!
# trying to force a read ...
read $ch 1 ;# --> error ... see below
--------------------------------------------
bad event name "rc7": must be readable or writable
--------------------------------------------
There's an error in the logic of the "watch" method.
I included a zip with all the updated files; corrections and some code cleaning.
- cat.tcl -- the main correction, and version changed to 1.0.3
- pkgIndex.tcl -- version changed
- cat.man -- version changed
- changeLog -- version changed
ABU
| |||
| User Comments: |
aku added on 2019-04-15 19:23:34:
Done with commit [aeb3bec0da]. Accepted with slight changes: - Comment tweaking, and - Restoring the early bailout in `read` when no channels to handle. - Added test suite for tcl::chan::cat. It seems that just changing `fileevent` to `chan event` does the trick. And I am completely boggled why. These should have been equivalent. And they are not. I confirmed, I added a test case based on the given example, and the `vwait` used as event loop is stuck without the change, exactly as described. | |||
Attachments:
- virtchannel_base.zip [download] added by anonymous on 2019-03-12 23:17:33. [details]
