diff options
-rw-r--r-- | Include/ceval.h | 4 | ||||
-rw-r--r-- | Include/pystate.h | 2 | ||||
-rw-r--r-- | Objects/longobject.c | 6 | ||||
-rw-r--r-- | Python/ceval.c | 10 | ||||
-rw-r--r-- | Python/sysmodule.c | 3 |
5 files changed, 15 insertions, 10 deletions
diff --git a/Include/ceval.h b/Include/ceval.h index 63204b2..e1af801 100644 --- a/Include/ceval.h +++ b/Include/ceval.h @@ -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 diff --git a/Include/pystate.h b/Include/pystate.h index 913dc7a..9b61ad7 100644 --- a/Include/pystate.h +++ b/Include/pystate.h @@ -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; diff --git a/Objects/longobject.c b/Objects/longobject.c index 9e641af..35d1211 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -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; } \ } diff --git a/Python/ceval.c b/Python/ceval.c index 8bd945e..8b3823a0 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -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; diff --git a/Python/sysmodule.c b/Python/sysmodule.c index cdacce3..9057938 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -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; |