diff options
-rw-r--r-- | generic/tclNotify.c | 29 | ||||
-rw-r--r-- | generic/tclTimer.c | 1 |
2 files changed, 22 insertions, 8 deletions
diff --git a/generic/tclNotify.c b/generic/tclNotify.c index 28c3879..1bb21b4 100644 --- a/generic/tclNotify.c +++ b/generic/tclNotify.c @@ -1526,10 +1526,18 @@ Tcl_DoOneEvent( */ result = 0; - if (blockTimeWasSet) { + if ((flags & TCL_DONT_WAIT) || blockTimeWasSet) { break; } - } while ( !(flags & TCL_DONT_WAIT) ); + + /* + * Reset block time before continue event-cycle. + */ + if (tsdPtr->blockTimeServLev < tsdPtr->serviceLevel) { + tsdPtr->blockTimeSet = 0; + tsdPtr->blockTimeServLev = 0; + } + } while (1); done: /* @@ -1579,6 +1587,7 @@ Tcl_ServiceAll(void) * avoid recursive calls. */ + tsdPtr->serviceLevel++; tsdPtr->serviceMode = TCL_SERVICE_NONE; /* @@ -1595,23 +1604,29 @@ Tcl_ServiceAll(void) * so we can avoid multiple changes. */ + tsdPtr->inTraversal++; tsdPtr->blockTimeSet = 0; + tsdPtr->blockTimeServLev = 0; SetUpEventSources(tsdPtr, TCL_ALL_EVENTS); CheckEventSources(tsdPtr, TCL_ALL_EVENTS); - while (Tcl_ServiceEvent(0)) { + if (Tcl_ServiceEvent(0)) { + while (Tcl_ServiceEvent(0)) {}; result = 1; } if (TclServiceIdle()) { result = 1; } - if (!tsdPtr->blockTimeSet) { - Tcl_SetTimer(NULL); - } else { - Tcl_SetTimer(&tsdPtr->blockTime); + if (tsdPtr->inTraversal-- <= 1) { + if (!tsdPtr->blockTimeSet) { + Tcl_SetTimer(NULL); + } else { + Tcl_SetTimer(&tsdPtr->blockTime); + } } + tsdPtr->serviceLevel--; tsdPtr->serviceMode = TCL_SERVICE_ALL; return result; } diff --git a/generic/tclTimer.c b/generic/tclTimer.c index d22d326..d4919f5 100644 --- a/generic/tclTimer.c +++ b/generic/tclTimer.c @@ -1208,7 +1208,6 @@ TclServiceTimerEvents(void) /* be sure that timer-list was not changed inside the proc call */ if (currentEpoch != tsdPtr->timerListEpoch) { /* timer-list was changed - stop processing */ - tsdPtr->timerPending++; break; } } |