summaryrefslogtreecommitdiffstats
path: root/generic/tclIORChan.c
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2021-06-15 14:55:56 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2021-06-15 14:55:56 (GMT)
commit90d1c081806119ca5d9ac34db13fdacc8a8350d7 (patch)
tree2ed0dda817111ab582e63f38a2b43f04b1bc146c /generic/tclIORChan.c
parent9a90abbff2cda1c773406d24e3c0e54df6cf083f (diff)
parent9b3ea0f675d8089cafb6fbf630e6842171bae682 (diff)
downloadtcl-90d1c081806119ca5d9ac34db13fdacc8a8350d7.zip
tcl-90d1c081806119ca5d9ac34db13fdacc8a8350d7.tar.gz
tcl-90d1c081806119ca5d9ac34db13fdacc8a8350d7.tar.bz2
Merge 8.7
Diffstat (limited to 'generic/tclIORChan.c')
-rw-r--r--generic/tclIORChan.c66
1 files changed, 6 insertions, 60 deletions
diff --git a/generic/tclIORChan.c b/generic/tclIORChan.c
index 82ed10b..dfcd035 100644
--- a/generic/tclIORChan.c
+++ b/generic/tclIORChan.c
@@ -54,8 +54,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.
@@ -113,17 +111,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.
*
@@ -133,9 +120,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;
@@ -940,18 +929,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 *)Tcl_Alloc(sizeof(ReflectEvent));
@@ -999,24 +977,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.
*/
@@ -1215,12 +1175,6 @@ ReflectClose(
Tcl_Free((void *)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;
}
@@ -1290,12 +1244,6 @@ ReflectClose(
Tcl_Free((void *)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;
}
@@ -2246,8 +2194,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