Index: Python/ceval.c =================================================================== RCS file: /home/cvs/stackless/src/Python/ceval.c,v retrieving revision 1.10 diff -u -r1.10 ceval.c --- Python/ceval.c 2002/06/03 20:45:41 1.10 +++ Python/ceval.c 2002/06/18 17:43:39 @@ -679,6 +679,19 @@ } #endif +#ifdef STACKLESS + if ( ! tstate->slp_state.switch_lock) { + PyTaskletObject *task = tstate->slp_state.current; + PyTaskletObject *next = (PyTaskletObject*)task->next; + if (task != next && tstate->slp_state.runcount != 0) { + if(slp_schedule_task(task, next)) { + why = WHY_EXCEPTION; + goto on_error; + } + } + } +#endif + #ifdef WITH_THREAD if (interpreter_lock) { /* Give another thread a chance */ Index: Stackless/stackless.h =================================================================== RCS file: /home/cvs/stackless/src/Stackless/stackless.h,v retrieving revision 1.28 diff -u -r1.28 stackless.h --- Stackless/stackless.h 2002/06/18 10:38:50 1.28 +++ Stackless/stackless.h 2002/06/18 17:43:39 @@ -97,6 +97,7 @@ struct _tasklet *client; PyObject *tempval; int slicing_lock; + int saved_switch_lock; } PyTaskletObject; /*** important structures: channel ***/ @@ -121,6 +122,8 @@ struct _tasklet *queue; /* recursion control */ int slice_interval; + /* schedule lock */ + int switch_lock; /* temporary variables for slp_switch */ struct { struct _cstack **cstprev, *cst; @@ -146,6 +149,7 @@ tstate->slp_state.waitcount = 0;\ tstate->slp_state.queue = NULL;\ tstate->slp_state.slice_interval = RECURSION_LIMIT;\ + tstate->slp_state.switch_lock = 1;\ #define STACKLESS_PYSTATE_ZAP \ ZAP(tstate->slp_state.initial_stub);\ Index: Stackless/stacklesseval.h =================================================================== RCS file: /home/cvs/stackless/src/Stackless/stacklesseval.h,v retrieving revision 1.40 diff -u -r1.40 stacklesseval.h --- Stackless/stacklesseval.h 2002/06/18 10:35:42 1.40 +++ Stackless/stacklesseval.h 2002/06/18 17:43:40 @@ -195,6 +195,7 @@ t->client = NULL; t->tempval = NULL; t->slicing_lock = 0; + t->saved_switch_lock = 1; /*init shouldn't matter...*/ } return t; } @@ -376,6 +377,12 @@ } else { savets.frame = NULL; + } + + /*save switch_lock*/ + { + prev->saved_switch_lock = tstate->slp_state.switch_lock; + tstate->slp_state.switch_lock = target->saved_switch_lock; } tstate->slp_state.current = target; Index: Stackless/stacklessmodule.c =================================================================== RCS file: /home/cvs/stackless/src/Stackless/stacklessmodule.c,v retrieving revision 1.23 diff -u -r1.23 stacklessmodule.c --- Stackless/stacklessmodule.c 2002/06/18 10:38:50 1.23 +++ Stackless/stacklessmodule.c 2002/06/18 17:43:40 @@ -82,6 +82,7 @@ {"tempval", T_OBJECT, offsetof(PyTaskletObject, tempval), READONLY}, {"blocked", T_INT, offsetof(PyTaskletObject, blocked), READONLY}, {"slicing_lock", T_INT, offsetof(PyTaskletObject, slicing_lock), READONLY},\ + {"saved_switch_lock", T_INT, offsetof(PyTaskletObject, saved_switch_lock), READONLY},\ {0} }; @@ -121,6 +122,24 @@ } +static char autoschedule_lock_doc__[] = +"Returns current state of the tasklet scheduler lock. \ +Sets the lock to the passed state."; + +static PyObject * +autoschedule_lock(PyObject *self, PyObject *args, PyObject *kwds) +{ + long state, ret; + static char *kwlist[] = {"state", NULL}; + PyThreadState *tstate = PyThreadState_GET(); + if (!PyArg_ParseTupleAndKeywords(args, kwds, "i:autoschedule_lock", kwlist, &state)) + return NULL; + + ret = tstate->slp_state.switch_lock; + tstate->slp_state.switch_lock = state; + return PyInt_FromLong(ret); +} + static char taskoutlet_call__doc__[] = "A call to this object takes the same parameters\n\ as the wrapped function. The function is not called;\n\ @@ -580,6 +599,8 @@ {"getruncount", (PyCFunction)getruncount, METH_NOARGS, getruncount__doc__}, {"getcurrent", (PyCFunction)getcurrent, METH_NOARGS, getcurrent__doc__}, {"getmain", (PyCFunction)getmain, METH_NOARGS, getmain__doc__}, + {"autoschedule_lock",(PyCFunction)autoschedule_lock, + METH_VARARGS | METH_KEYWORDS, autoschedule_lock_doc__}, #ifdef STACKLESS_SPY {"_peek", (PyCFunction)_peek, METH_O, _peek__doc__}, #endif