summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2021-06-15 12:56:58 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2021-06-15 12:56:58 (GMT)
commit3dae26e8e93672b08eec6e43b128ce81b70b5c7f (patch)
tree7320e1d4093d5c497b00e0c2cf6450f81f27352c
parenta232debfd3c25f3587c75f56329ec2618ed99d64 (diff)
downloadtcl-3dae26e8e93672b08eec6e43b128ce81b70b5c7f.zip
tcl-3dae26e8e93672b08eec6e43b128ce81b70b5c7f.tar.gz
tcl-3dae26e8e93672b08eec6e43b128ce81b70b5c7f.tar.bz2
Fix [18f4a94d03] by backout out [9bcec7cd880540c3]
-rw-r--r--generic/tclIORChan.c66
-rw-r--r--tests/ioCmd.test53
2 files changed, 14 insertions, 105 deletions
diff --git a/generic/tclIORChan.c b/generic/tclIORChan.c
index 9097bf4..65f166b 100644
--- a/generic/tclIORChan.c
+++ b/generic/tclIORChan.c
@@ -58,8 +58,6 @@ static int ReflectSetOption(ClientData clientData,
const char *newValue);
static int ReflectTruncate(ClientData clientData,
long long length);
-static void TimerRunRead(ClientData clientData);
-static void TimerRunWrite(ClientData clientData);
/*
* The C layer channel type/driver definition used by the reflection.
@@ -121,17 +119,6 @@ typedef struct {
int dead; /* Boolean signal that some operations
* should no longer be attempted. */
- Tcl_TimerToken readTimer; /*
- A token for the timer that is scheduled in
- order to call Tcl_NotifyChannel when the
- channel is readable
- */
- Tcl_TimerToken writeTimer; /*
- A token for the timer that is scheduled in
- order to call Tcl_NotifyChannel when the
- channel is writable
- */
-
/*
* Note regarding the usage of timers.
*
@@ -141,9 +128,11 @@ typedef struct {
*
* See 'rechan', 'memchan', etc.
*
- * A timer is used here as well in order to ensure at least on pass through
- * the event loop when a channel becomes ready. See issues 67a5eabbd3d1 and
- * ef28eb1f1516.
+ * Here this is _not_ required. Interest in events is posted to the Tcl
+ * level via 'watch'. And posting of events is possible from the Tcl level
+ * as well, via 'chan postevent'. This means that the generation of all
+ * events, fake or not, timer based or not, is completely in the hands of
+ * the Tcl level. Therefore no timer here.
*/
} ReflectedChannel;
@@ -951,18 +940,7 @@ TclChanPostEventObjCmd(
#if TCL_THREADS
if (rcPtr->owner == rcPtr->thread) {
#endif
- if (events & TCL_READABLE) {
- if (rcPtr->readTimer == NULL) {
- rcPtr->readTimer = Tcl_CreateTimerHandler(SYNTHETIC_EVENT_TIME,
- TimerRunRead, rcPtr);
- }
- }
- if (events & TCL_WRITABLE) {
- if (rcPtr->writeTimer == NULL) {
- rcPtr->writeTimer = Tcl_CreateTimerHandler(SYNTHETIC_EVENT_TIME,
- TimerRunWrite, rcPtr);
- }
- }
+ Tcl_NotifyChannel(chan, events);
#if TCL_THREADS
} else {
ReflectEvent *ev = (ReflectEvent *)ckalloc(sizeof(ReflectEvent));
@@ -1010,24 +988,6 @@ TclChanPostEventObjCmd(
#undef EVENT
}
-static void
-TimerRunRead(
- ClientData clientData)
-{
- ReflectedChannel *rcPtr = (ReflectedChannel *)clientData;
- rcPtr->readTimer = NULL;
- Tcl_NotifyChannel(rcPtr->chan, TCL_READABLE);
-}
-
-static void
-TimerRunWrite(
- ClientData clientData)
-{
- ReflectedChannel *rcPtr = (ReflectedChannel *)clientData;
- rcPtr->writeTimer = NULL;
- Tcl_NotifyChannel(rcPtr->chan, TCL_WRITABLE);
-}
-
/*
* Channel error message marshalling utilities.
*/
@@ -1226,12 +1186,6 @@ ReflectClose(
ckfree(tctPtr);
((Channel *)rcPtr->chan)->typePtr = NULL;
}
- if (rcPtr->readTimer != NULL) {
- Tcl_DeleteTimerHandler(rcPtr->readTimer);
- }
- if (rcPtr->writeTimer != NULL) {
- Tcl_DeleteTimerHandler(rcPtr->writeTimer);
- }
Tcl_EventuallyFree(rcPtr, (Tcl_FreeProc *) FreeReflectedChannel);
return EOK;
}
@@ -1301,12 +1255,6 @@ ReflectClose(
ckfree(tctPtr);
((Channel *)rcPtr->chan)->typePtr = NULL;
}
- if (rcPtr->readTimer != NULL) {
- Tcl_DeleteTimerHandler(rcPtr->readTimer);
- }
- if (rcPtr->writeTimer != NULL) {
- Tcl_DeleteTimerHandler(rcPtr->writeTimer);
- }
Tcl_EventuallyFree(rcPtr, (Tcl_FreeProc *) FreeReflectedChannel);
return (result == TCL_OK) ? EOK : EINVAL;
}
@@ -2277,8 +2225,6 @@ NewReflectedChannel(
rcPtr->chan = NULL;
rcPtr->interp = interp;
rcPtr->dead = 0;
- rcPtr->readTimer = 0;
- rcPtr->writeTimer = 0;
#if TCL_THREADS
rcPtr->thread = Tcl_GetCurrentThread();
#endif
diff --git a/tests/ioCmd.test b/tests/ioCmd.test
index dbca866..8b0beb0 100644
--- a/tests/ioCmd.test
+++ b/tests/ioCmd.test
@@ -930,17 +930,6 @@ proc onfinal {} {
if {[lindex $hargs 0] ne "finalize"} {return}
return -code return ""
}
-
-proc onwatch {} {
- upvar args hargs
- lassign $hargs watch chan eventspec
- if {$watch ne "watch"} return
- foreach spec $eventspec {
- chan postevent $chan $spec
- }
- return
-}
-
}
# Set everything up in the main thread.
@@ -2013,29 +2002,28 @@ test iocmd-31.6 {chan postevent, posted events do happen} -match glob -body {
set res {}
proc foo {args} {oninit; onfinal; track; return}
set c [chan create {r w} foo]
- set tock {}
- note [fileevent $c readable {lappend res TOCK; set tock 1}]
- set stop [after 15000 {lappend res TIMEOUT; set tock 1}]
+ note [fileevent $c readable {note TOCK}]
+ set stop [after 15000 {note TIMEOUT}]
after 1000 {note [chan postevent $c r]}
- vwait ::tock
+ vwait ::res
catch {after cancel $stop}
close $c
rename foo {}
set res
-} -result {{watch rc* read} {} {} TOCK {watch rc* {}}}
+} -result {{watch rc* read} {} TOCK {} {watch rc* {}}}
test iocmd-31.7 {chan postevent, posted events do happen} -match glob -body {
set res {}
proc foo {args} {oninit; onfinal; track; return}
set c [chan create {r w} foo]
- note [fileevent $c writable {lappend res TOCK; set tock 1}]
- set stop [after 15000 {lappend res TIMEOUT; set tock 1}]
+ note [fileevent $c writable {note TOCK}]
+ set stop [after 15000 {note TIMEOUT}]
after 1000 {note [chan postevent $c w]}
- vwait ::tock
+ vwait ::res
catch {after cancel $stop}
close $c
rename foo {}
set res
-} -result {{watch rc* write} {} {} TOCK {watch rc* {}}}
+} -result {{watch rc* write} {} TOCK {} {watch rc* {}}}
test iocmd-31.8 {chan postevent after close throws error} -match glob -setup {
proc foo {args} {oninit; onfinal; track; return}
proc dummy args { return }
@@ -2048,31 +2036,6 @@ test iocmd-31.8 {chan postevent after close throws error} -match glob -setup {
rename foo {}
rename dummy {}
} -returnCodes error -result {can not find reflected channel named "rc*"}
-test iocmd-31.9 {
- chan postevent
-
- call to current coroutine
-
- see 67a5eabbd3d1
-} -match glob -body {
- set res {}
- proc foo {args} {oninit; onwatch; onfinal; track; return}
- set c [chan create {r w} foo]
- after 0 [list ::apply [list c {
- coroutine c1 ::apply [list c {
- chan event $c readable [list [info coroutine]]
- yield
- set ::done READING
- } [namespace current]] $c
- } [namespace current]] $c]
- set stop [after 10000 {set done TIMEOUT}]
- vwait ::done
- catch {after cancel $stop}
- lappend res $done
- close $c
- rename foo {}
- set res
-} -result {{watch rc* read} READING {watch rc* {}}}
# --- === *** ###########################
# 'Pull the rug' tests. Create channel in a interpreter A, move to