summaryrefslogtreecommitdiffstats
path: root/generic/tclExecute.c
diff options
context:
space:
mode:
Diffstat (limited to 'generic/tclExecute.c')
-rw-r--r--generic/tclExecute.c50
1 files changed, 36 insertions, 14 deletions
diff --git a/generic/tclExecute.c b/generic/tclExecute.c
index 3ff411d..5a13482 100644
--- a/generic/tclExecute.c
+++ b/generic/tclExecute.c
@@ -11,7 +11,7 @@
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclExecute.c,v 1.122 2004/03/30 16:22:21 msofer Exp $
+ * RCS: @(#) $Id: tclExecute.c,v 1.123 2004/03/30 19:17:57 msofer Exp $
*/
#include "tclInt.h"
@@ -61,6 +61,16 @@ int errno;
# endif /* MAXDOUBLE */
#endif /* !DBL_MAX */
+/*
+ * A mask (should be 2**n-1) that is used to work out when the
+ * bytecode engine should call Tcl_AsyncReady() to see whether there
+ * is a signal that needs handling.
+ */
+
+#ifndef ASYNC_CHECK_COUNT_MASK
+# define ASYNC_CHECK_COUNT_MASK 63
+#endif /* !ASYNC_CHECK_COUNT_MASK */
+
/*
* Boolean flag indicating whether the Tcl bytecode interpreter has been
@@ -1089,6 +1099,8 @@ TclExecuteByteCode(interp, codePtr)
int traceInstructions = (tclTraceExec == 3);
char cmdNameBuf[21];
#endif
+ int instructionCount = 0; /* Counter that is used to work out
+ * when to call Tcl_AsyncReady() */
Namespace *namespacePtr;
int codeCompileEpoch = codePtr->compileEpoch;
int codeNsEpoch = codePtr->nsEpoch;
@@ -1213,21 +1225,23 @@ TclExecuteByteCode(interp, codePtr)
iPtr->stats.instructionCount[*pc]++;
#endif
- switch (*pc) {
- case INST_START_CMD:
- /*
- * Check for asynchronous handlers [Bug 746722].
- */
+ /*
+ * Check for asynchronous handlers [Bug 746722]; we
+ * do the check every ASYNC_CHECK_COUNT_MASK instruction,
+ * of the form (2**n-1).
+ */
- if (Tcl_AsyncReady()) {
- DECACHE_STACK_INFO();
- result = Tcl_AsyncInvoke(interp, result);
- CACHE_STACK_INFO();
- if (result == TCL_ERROR) {
- goto checkForCatch;
- }
+ if (!(instructionCount++ & ASYNC_CHECK_COUNT_MASK) && Tcl_AsyncReady()) {
+ DECACHE_STACK_INFO();
+ result = Tcl_AsyncInvoke(interp, result);
+ CACHE_STACK_INFO();
+ if (result == TCL_ERROR) {
+ goto checkForCatch;
}
-
+ }
+
+ switch (*pc) {
+ case INST_START_CMD:
if ((!(iPtr->flags & DELETED)
&& (codeCompileEpoch == iPtr->compileEpoch)
&& (codeNsEpoch == namespacePtr->resolverEpoch))
@@ -1551,6 +1565,14 @@ TclExecuteByteCode(interp, codePtr)
preservedStackRefCountPtr = (char **) (eePtr->stackPtr-1);
++*preservedStackRefCountPtr;
+ /*
+ * Reset the instructionCount variable, since we're about
+ * to check for async stuff anyway while processing
+ * TclEvalObjvInternal.
+ */
+
+ instructionCount = 1;
+
/*
* Finally, let TclEvalObjvInternal handle the command.
*/