summaryrefslogtreecommitdiffstats
path: root/Include/pystate.h
diff options
context:
space:
mode:
Diffstat (limited to 'Include/pystate.h')
-rw-r--r--Include/pystate.h134
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 */