replace thread state objects' ticker and checkinterval fields with two
authorSkip Montanaro <skip@pobox.com>
Tue, 3 Sep 2002 20:10:45 +0000 (20:10 +0000)
committerSkip Montanaro <skip@pobox.com>
Tue, 3 Sep 2002 20:10:45 +0000 (20:10 +0000)
globals, _Py_Ticker and _Py_CheckInterval.  This also implements Jeremy's
shortcut in Py_AddPendingCall that zeroes out _Py_Ticker.  This allows the
test in the main loop to only test a single value.

The gory details are at

    http://python.org/sf/602191

Include/ceval.h
Include/pystate.h
Objects/longobject.c
Python/ceval.c
Python/sysmodule.c

index 63204b267e9d8797d2ec5c0231c3e56a7e25ee09..e1af801bc055bc20dae7bd144599b0823f9c43dc 100644 (file)
@@ -48,6 +48,10 @@ PyAPI_FUNC(int) Py_GetRecursionLimit(void);
 PyAPI_FUNC(char *) PyEval_GetFuncName(PyObject *);
 PyAPI_FUNC(char *) PyEval_GetFuncDesc(PyObject *);
 
+/* this used to be handled on a per-thread basis - now just two globals */
+PyAPI_DATA(volatile int) _Py_Ticker;
+PyAPI_DATA(int) _Py_CheckInterval;
+
 /* Interface for threads.
 
    A module that plans to do a blocking system call (or something else
index 913dc7a674add0347c49c344ec74f347e74200ec..9b61ad7d39e0d6792c31d1110cd2db1dca3aab51 100644 (file)
@@ -22,7 +22,6 @@ typedef struct _is {
     PyObject *sysdict;
     PyObject *builtins;
 
-    int checkinterval;
 #ifdef HAVE_DLOPEN
     int dlopenflags;
 #endif
@@ -50,7 +49,6 @@ typedef struct _ts {
 
     struct _frame *frame;
     int recursion_depth;
-    int ticker;
     int tracing;
     int use_tracing;
 
index 9e641af98d3fdefd65102a659ce5f57af76e2a2e..35d121120d0e90bf978cb15c8660332fa6ede22f 100644 (file)
@@ -28,11 +28,9 @@ static PyLongObject *muladd1(PyLongObject *, wdigit, wdigit);
 static PyLongObject *divrem1(PyLongObject *, digit, digit *);
 static PyObject *long_format(PyObject *aa, int base, int addL);
 
-static int ticker;     /* XXX Could be shared with ceval? */
-
 #define SIGCHECK(PyTryBlock) \
-       if (--ticker < 0) { \
-               ticker = 100; \
+       if (--_Py_Ticker < 0) { \
+               _Py_Ticker = _Py_CheckInterval; \
                if (PyErr_CheckSignals()) { PyTryBlock; } \
        }
 
index 8bd945ed05b42774daef53d78f6707f525d8af1c..8b3823a05d9c7e3041656b48913683bb13e66306 100644 (file)
@@ -395,6 +395,8 @@ Py_AddPendingCall(int (*func)(void *), void *arg)
        pendingcalls[i].func = func;
        pendingcalls[i].arg = arg;
        pendinglast = j;
+
+       _Py_Ticker = 0;
        things_to_do = 1; /* Signal main loop */
        busy = 0;
        /* XXX End critical section */
@@ -465,6 +467,10 @@ enum why_code {
 static enum why_code do_raise(PyObject *, PyObject *, PyObject *);
 static int unpack_iterable(PyObject *, int, PyObject **);
 
+/* for manipulating the thread switch and periodic "stuff" - used to be
+   per thread, now just a pair o' globals */
+int _Py_CheckInterval = 10;
+volatile int _Py_Ticker = 10;
 
 PyObject *
 PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
@@ -669,8 +675,8 @@ eval_frame(PyFrameObject *f)
                   async I/O handler); see Py_AddPendingCall() and
                   Py_MakePendingCalls() above. */
 
-               if (things_to_do || --tstate->ticker < 0) {
-                       tstate->ticker = tstate->interp->checkinterval;
+               if (--_Py_Ticker < 0) {
+                       _Py_Ticker = _Py_CheckInterval;
                        if (things_to_do) {
                                if (Py_MakePendingCalls() < 0) {
                                        why = WHY_EXCEPTION;
index cdacce36887260a82321357b8452f7c5e102ebf6..9057938ddeda9affdbca692072c402a6e877d0d2 100644 (file)
@@ -352,8 +352,7 @@ and return.  See the profiler chapter in the library manual."
 static PyObject *
 sys_setcheckinterval(PyObject *self, PyObject *args)
 {
-       PyThreadState *tstate = PyThreadState_Get();
-       if (!PyArg_ParseTuple(args, "i:setcheckinterval", &tstate->interp->checkinterval))
+       if (!PyArg_ParseTuple(args, "i:setcheckinterval", &_Py_CheckInterval))
                return NULL;
        Py_INCREF(Py_None);
        return Py_None;