summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Include/ceval.h4
-rw-r--r--Include/pystate.h2
-rw-r--r--Objects/longobject.c6
-rw-r--r--Python/ceval.c10
-rw-r--r--Python/sysmodule.c3
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;