diff options
Diffstat (limited to 'Include/pystate.h')
-rw-r--r-- | Include/pystate.h | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/Include/pystate.h b/Include/pystate.h new file mode 100644 index 0000000..514c46d --- /dev/null +++ b/Include/pystate.h @@ -0,0 +1,134 @@ +#ifndef Py_PYSTATE_H +#define Py_PYSTATE_H +#ifdef __cplusplus +extern "C" { +#endif + +/*********************************************************** +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 */ + + +/* State shared between threads */ + +#define NEXITFUNCS 32 + +typedef struct _is { + + PyObject *import_modules; + PyObject *sysdict; + + int nthreads; + + void (*exitfuncs[NEXITFUNCS])(); + int nexitfuncs; + +} PyInterpreterState; + + +/* State unique per thread */ + +struct _frame; /* Avoid including frameobject.h */ + +typedef struct _ts { + + PyInterpreterState *interpreter_state; + + struct _frame *frame; + int recursion_depth; + int ticker; + int tracing; + + PyObject *sys_profilefunc; + PyObject *sys_tracefunc; + int sys_checkinterval; + + PyObject *curexc_type; + PyObject *curexc_value; + PyObject *curexc_traceback; + + PyObject *exc_type; + PyObject *exc_value; + PyObject *exc_traceback; + + /* XXX Other state that should be here: + - signal handlers + - low-level "pending calls" + Problem with both is that they may be referenced from + interrupt handlers where there is no clear concept of a + "current thread"??? + */ + +} PyThreadState; + + +PyInterpreterState *PyInterpreterState_New(void); +void PyInterpreterState_Delete(PyInterpreterState *); + +PyThreadState *PyThreadState_New(PyInterpreterState *); +void PyThreadState_Delete(PyThreadState *); + +PyThreadState *PyThreadState_Get(void); +PyThreadState *PyThreadState_Swap(PyThreadState *); + +/* Some background. + + There are lots of issues here. + + First, we can build Python without threads, with threads, or (when + Greg Stein's mods are out of beta, on some platforms) with free + threading. + + Next, assuming some form of threading is used, there can be several + kinds of threads. Python code can create threads with the thread + module. C code can create threads with the interface defined in + python's "thread.h". Or C code can create threads directly with + the OS threads interface (e.g. Solaris threads, SGI threads or + pthreads, whatever is being used, as long as it's the same that + Python is configured for). + + Next, let's discuss sharing of interpreter state between threads. + The exception state (sys.exc_* currently) should never be shared + between threads, because it is stack frame specific. The contents + of the sys module, in particular sys.modules and sys.path, are + generally shared between threads. But occasionally it is useful to + have separate module collections, e.g. when threads originate in C + code and are used to execute unrelated Python scripts. + (Traditionally, one would use separate processes for this, but + there are lots of reasons why threads are attractive.) + +*/ + +#ifdef __cplusplus +} +#endif +#endif /* !Py_PYSTATE_H */ |