Tcl Source Code

Artifact [3497ac4e46]
Login

Artifact 3497ac4e463287bd00cfcb4e86a0a4ca58426f1e:

Attachment "refchanbug.patch" to ticket [3522560fff] added by ferrieux 2012-05-03 04:50:28.
Index: tests/ioCmd.test
===================================================================
--- tests/ioCmd.test
+++ tests/ioCmd.test
@@ -2584,36 +2584,52 @@
 } -result {{write rc* ABC} {watch rc* write} {}} \
     -constraints {testchannel thread}
 
 test iocmd.tf-24.16 {chan write, note the background flush setup by close due to the EAGAIN leaving data in buffers.} -match glob -setup {
     set res {}
+    set again 1
+    proc blah s {exec echo $s > /dev/tty}
     proc foo {args} {
+	blah FOO:$args
 	oninit; onfinal; track
 	# Note: The EAGAIN signals that the channel cannot accept
 	# write requests right now, this in turn causes the IO core to
 	# request the generation of writable events (see expected
 	# result below, and compare to case 24.14 above).
-	error EAGAIN
+	if {[lindex $args 0]=="write"} {
+	    if {$::again} {
+		set ::again 0
+		after 400 {blah POSTEVENT;chan postevent $::c w}
+		blah RET:EAGAIN
+		error EAGAIN
+	    } else {
+		set n  [string length [lindex $args 2]]
+		blah RET:$n
+		return $n
+	    }
+	}
     }
     set c [chan create {r w} foo]
     fconfigure $c -blocking 0
 } -body {
     notes [inthread $c {
 	note [puts -nonewline $c ABC ; flush $c]
 	close $c
+	after 200 {set ::finalflush 1}
+	vwait ::finalflush
 	notes
     } c]
     # Replace handler with all-tracking one which doesn't error.
     # This will tell us if a write-due-flush is there.
-    proc foo {args} { onfinal; note BG ; track ; set ::endbody-24.16 1}
+    proc foo {args} {blah FOO2:$args; onfinal; note BG ; track ; set ::endbody-24.16 1;if {[lindex args 0]=="write"} {return [string length [lindex $args 2]]}}
     # Flush (sic!) the event-queue to capture the write from a
     # BG-flush.
     after 1000 {set ::endbody-24.16 2}
     vwait endbody-24.16
     set res
 } -cleanup {
-    proc foo {args} {onfinal; set ::done-24.16 1; return 3}
+    proc foo {args} {blah FOO3:$args;onfinal; set ::done-24.16 1; if {[lindex args 0]=="write"} {return [string length [lindex $args 2]]}}
     after 1000 {set ::done-24.16 2}
     vwait done-24.16
     rename foo {}
     unset res
 } -result {{write rc* ABC} {watch rc* write} {} BG {write rc* ABC}} \