diff options
author | Guido van Rossum <guido@python.org> | 1997-05-05 20:56:21 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 1997-05-05 20:56:21 (GMT) |
commit | a027efa5bfa7911b5c4b522b6a0698749a6f2e4a (patch) | |
tree | 7027609cb66223aba0355957599aa7629fce7e53 /Python/pystate.c | |
parent | 73237c54b40c345813fa6b7831a32b10fa4671b5 (diff) | |
download | cpython-a027efa5bfa7911b5c4b522b6a0698749a6f2e4a.zip cpython-a027efa5bfa7911b5c4b522b6a0698749a6f2e4a.tar.gz cpython-a027efa5bfa7911b5c4b522b6a0698749a6f2e4a.tar.bz2 |
Massive changes for separate thread state management.
All per-thread globals are moved into a struct which is manipulated
separately.
Diffstat (limited to 'Python/pystate.c')
-rw-r--r-- | Python/pystate.c | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/Python/pystate.c b/Python/pystate.c new file mode 100644 index 0000000..7ce499a --- /dev/null +++ b/Python/pystate.c @@ -0,0 +1,163 @@ +/*********************************************************** +Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam, +The Netherlands. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Stichting Mathematisch +Centrum or CWI or Corporation for National Research Initiatives or +CNRI not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. + +While CWI is the initial source for this software, a modified version +is made available by the Corporation for National Research Initiatives +(CNRI) at the Internet address ftp://ftp.python.org. + +STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH +CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL +DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR +PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. + +******************************************************************/ + +/* Thread and interpreter state structures and their interfaces */ + +#include "Python.h" + + +static PyThreadState *current_tstate = NULL; + + +PyInterpreterState * +PyInterpreterState_New() +{ + PyInterpreterState *interp = PyMem_NEW(PyInterpreterState, 1); + if (interp != NULL) { + interp->import_modules = NULL; + interp->sysdict = NULL; + interp->nthreads = 0; + interp->nexitfuncs = 0; + } + return interp; +} + + +void +PyInterpreterState_Delete(PyInterpreterState *interp) +{ + Py_XDECREF(interp->import_modules); + Py_XDECREF(interp->sysdict); + + PyMem_DEL(interp); +} + + +PyThreadState * +PyThreadState_New(PyInterpreterState *interp) +{ + PyThreadState *tstate = PyMem_NEW(PyThreadState, 1); + /* fprintf(stderr, "new tstate -> %p\n", tstate); */ + if (tstate != NULL) { + tstate->interpreter_state = interp; + + tstate->frame = NULL; + tstate->recursion_depth = 0; + tstate->ticker = 0; + tstate->tracing = 0; + + tstate->curexc_type = NULL; + tstate->curexc_value = NULL; + tstate->curexc_traceback = NULL; + + tstate->exc_type = NULL; + tstate->exc_value = NULL; + tstate->exc_traceback = NULL; + + tstate->sys_profilefunc = NULL; + tstate->sys_tracefunc = NULL; + tstate->sys_checkinterval = 0; + + interp->nthreads++; + } + return tstate; +} + + +void +PyThreadState_Delete(PyThreadState *tstate) +{ + /* fprintf(stderr, "delete tstate %p\n", tstate); */ + if (tstate == current_tstate) + current_tstate = NULL; + tstate->interpreter_state->nthreads--; + + Py_XDECREF((PyObject *) (tstate->frame)); /* XXX really? */ + + Py_XDECREF(tstate->curexc_type); + Py_XDECREF(tstate->curexc_value); + Py_XDECREF(tstate->curexc_traceback); + + Py_XDECREF(tstate->exc_type); + Py_XDECREF(tstate->exc_value); + Py_XDECREF(tstate->exc_traceback); + + Py_XDECREF(tstate->sys_profilefunc); + Py_XDECREF(tstate->sys_tracefunc); + + PyMem_DEL(tstate); +} + + +PyThreadState * +PyThreadState_Get() +{ + /* fprintf(stderr, "get tstate -> %p\n", current_tstate); */ + return current_tstate; +} + + +PyThreadState * +PyThreadState_Swap(PyThreadState *new) +{ + PyThreadState *old = current_tstate; + /* fprintf(stderr, "swap tstate new=%p <--> old=%p\n", new, old); */ + current_tstate = new; + return old; +} + + +/* How should one use this code? + + 1. Standard Python interpreter, assuming no other interpreters or threads: + + PyInterpreterState *interp; + PyThreadState *tstate; + interp = PyInterpreterState_New(); + if (interp == NULL) + Py_FatalError("..."); + tstate = PyThreadState_New(interp); + if (tstate == NULL) + Py_FatalError("..."); + (void) PyThreadState_Swap(tstate); + PyInitialize(); + . + . (use the interpreter here) + . + Py_Cleanup(); + PyThreadState_Delete(tstate); + PyInterpreterState_Delete(interp); + + 2. Totally indepent interpreter invocation in a separate C thread: + + XXX Need to interact with the thread lock nevertheless!!! + +*/ |