blob: c1182a67833ec72d69ddff27324a5348ca7dc5b1 [file] [log] [blame]
Guido van Rossuma027efa1997-05-05 20:56:21 +00001
2/* Thread and interpreter state structures and their interfaces */
3
4
Fred Drake5eb6d4e2000-07-08 23:37:28 +00005#ifndef Py_PYSTATE_H
6#define Py_PYSTATE_H
7#ifdef __cplusplus
8extern "C" {
9#endif
10
Guido van Rossuma027efa1997-05-05 20:56:21 +000011/* State shared between threads */
12
Guido van Rossum29e46a91997-08-02 02:56:48 +000013struct _ts; /* Forward */
14struct _is; /* Forward */
15
Guido van Rossuma027efa1997-05-05 20:56:21 +000016typedef struct _is {
17
Fred Drake5eb6d4e2000-07-08 23:37:28 +000018 struct _is *next;
19 struct _ts *tstate_head;
Guido van Rossum29e46a91997-08-02 02:56:48 +000020
Fred Drake5eb6d4e2000-07-08 23:37:28 +000021 PyObject *modules;
22 PyObject *sysdict;
23 PyObject *builtins;
Guido van Rossuma027efa1997-05-05 20:56:21 +000024
Gustavo Niemeyer5ddd4c32003-03-19 00:35:36 +000025 PyObject *codec_search_path;
26 PyObject *codec_search_cache;
27 PyObject *codec_error_registry;
28
Martin v. Löwisf0473d52001-07-18 16:17:16 +000029#ifdef HAVE_DLOPEN
30 int dlopenflags;
31#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +000032
33} PyInterpreterState;
34
35
36/* State unique per thread */
37
38struct _frame; /* Avoid including frameobject.h */
39
Fred Drake55fb6e02001-06-27 19:18:03 +000040/* Py_tracefunc return -1 when raising an exception, or 0 for success. */
41typedef int (*Py_tracefunc)(PyObject *, struct _frame *, int, PyObject *);
42
43/* The following values are used for 'what' for tracefunc functions: */
44#define PyTrace_CALL 0
45#define PyTrace_EXCEPTION 1
46#define PyTrace_LINE 2
47#define PyTrace_RETURN 3
48
Guido van Rossuma027efa1997-05-05 20:56:21 +000049typedef struct _ts {
50
Fred Drake5eb6d4e2000-07-08 23:37:28 +000051 struct _ts *next;
52 PyInterpreterState *interp;
Guido van Rossuma027efa1997-05-05 20:56:21 +000053
Fred Drake5eb6d4e2000-07-08 23:37:28 +000054 struct _frame *frame;
55 int recursion_depth;
Fred Drake5eb6d4e2000-07-08 23:37:28 +000056 int tracing;
Fred Drake9e3ad782001-07-03 23:39:52 +000057 int use_tracing;
Guido van Rossuma027efa1997-05-05 20:56:21 +000058
Fred Drake55fb6e02001-06-27 19:18:03 +000059 Py_tracefunc c_profilefunc;
60 Py_tracefunc c_tracefunc;
61 PyObject *c_profileobj;
62 PyObject *c_traceobj;
Guido van Rossuma027efa1997-05-05 20:56:21 +000063
Fred Drake5eb6d4e2000-07-08 23:37:28 +000064 PyObject *curexc_type;
65 PyObject *curexc_value;
66 PyObject *curexc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +000067
Fred Drake5eb6d4e2000-07-08 23:37:28 +000068 PyObject *exc_type;
69 PyObject *exc_value;
70 PyObject *exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +000071
Fred Drake5eb6d4e2000-07-08 23:37:28 +000072 PyObject *dict;
Guido van Rossumee0a63b1998-04-13 20:24:05 +000073
Michael W. Hudson019a78e2002-11-08 12:53:11 +000074 int tick_counter;
Mark Hammond8d98d2c2003-04-19 15:41:53 +000075 int gilstate_counter;
Michael W. Hudson019a78e2002-11-08 12:53:11 +000076
Fred Drake5eb6d4e2000-07-08 23:37:28 +000077 /* XXX signal handlers should also be here */
Guido van Rossuma027efa1997-05-05 20:56:21 +000078
79} PyThreadState;
80
81
Mark Hammond91a681d2002-08-12 07:21:58 +000082PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_New(void);
83PyAPI_FUNC(void) PyInterpreterState_Clear(PyInterpreterState *);
84PyAPI_FUNC(void) PyInterpreterState_Delete(PyInterpreterState *);
Guido van Rossuma027efa1997-05-05 20:56:21 +000085
Mark Hammond91a681d2002-08-12 07:21:58 +000086PyAPI_FUNC(PyThreadState *) PyThreadState_New(PyInterpreterState *);
87PyAPI_FUNC(void) PyThreadState_Clear(PyThreadState *);
88PyAPI_FUNC(void) PyThreadState_Delete(PyThreadState *);
Guido van Rossum29757862001-01-23 01:46:06 +000089#ifdef WITH_THREAD
Mark Hammond91a681d2002-08-12 07:21:58 +000090PyAPI_FUNC(void) PyThreadState_DeleteCurrent(void);
Guido van Rossum29757862001-01-23 01:46:06 +000091#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +000092
Mark Hammond91a681d2002-08-12 07:21:58 +000093PyAPI_FUNC(PyThreadState *) PyThreadState_Get(void);
94PyAPI_FUNC(PyThreadState *) PyThreadState_Swap(PyThreadState *);
95PyAPI_FUNC(PyObject *) PyThreadState_GetDict(void);
Guido van Rossuma027efa1997-05-05 20:56:21 +000096
Guido van Rossum275ea671998-12-21 18:28:10 +000097
98/* Variable and macro for in-line access to current thread state */
99
Mark Hammond91a681d2002-08-12 07:21:58 +0000100PyAPI_DATA(PyThreadState *) _PyThreadState_Current;
Guido van Rossum275ea671998-12-21 18:28:10 +0000101
102#ifdef Py_DEBUG
103#define PyThreadState_GET() PyThreadState_Get()
104#else
105#define PyThreadState_GET() (_PyThreadState_Current)
106#endif
107
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000108typedef
109 enum {PyGILState_LOCKED, PyGILState_UNLOCKED}
110 PyGILState_STATE;
111
112/* Ensure that the current thread is ready to call the Python
113 C API, regardless of the current state of Python, or of its
114 thread lock. This may be called as many times as desired
115 by a thread so long as each call is matched with a call to
116 PyGILState_Release(). In general, other thread-state APIs may
117 be used between _Ensure() and _Release() calls, so long as the
118 thread-state is restored to its previous state before the Release().
119 For example, normal use of the Py_BEGIN_ALLOW_THREADS/
120 Py_END_ALLOW_THREADS macros are acceptable.
121
122 The return value is an opaque "handle" to the thread state when
123 PyGILState_Acquire() was called, and must be passed to
124 PyGILState_Release() to ensure Python is left in the same state. Even
125 though recursive calls are allowed, these handles can *not* be shared -
126 each unique call to PyGILState_Ensure must save the handle for its
127 call to PyGILState_Release.
128
129 When the function returns, the current thread will hold the GIL.
130
131 Failure is a fatal error.
132*/
133PyAPI_FUNC(PyGILState_STATE) PyGILState_Ensure(void);
134
135/* Release any resources previously acquired. After this call, Python's
136 state will be the same as it was prior to the corresponding
137 PyGILState_Acquire call (but generally this state will be unknown to
138 the caller, hence the use of the GILState API.)
139
140 Every call to PyGILState_Ensure must be matched by a call to
141 PyGILState_Release on the same thread.
142*/
143PyAPI_FUNC(void) PyGILState_Release(PyGILState_STATE);
144
145/* Helper/diagnostic function - get the current thread state for
146 this thread. May return NULL if no GILState API has been used
147 on the current thread. Note the main thread always has such a
148 thread-state, even if no auto-thread-state call has been made
149 on the main thread.
150*/
151PyAPI_FUNC(PyThreadState *) PyGILState_GetThisThreadState(void);
152
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000153/* Routines for advanced debuggers, requested by David Beazley.
154 Don't use unless you know what you are doing! */
Mark Hammond91a681d2002-08-12 07:21:58 +0000155PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_Head(void);
156PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_Next(PyInterpreterState *);
157PyAPI_FUNC(PyThreadState *) PyInterpreterState_ThreadHead(PyInterpreterState *);
158PyAPI_FUNC(PyThreadState *) PyThreadState_Next(PyThreadState *);
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000159
Guido van Rossum6297a7a2003-02-19 15:53:17 +0000160typedef struct _frame *(*PyThreadFrameGetter)(PyThreadState *self_);
161
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000162/* hook for PyEval_GetFrame(), requested for Psyco */
Guido van Rossum6297a7a2003-02-19 15:53:17 +0000163PyAPI_DATA(PyThreadFrameGetter) _PyThreadState_GetFrame;
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000164
Guido van Rossuma027efa1997-05-05 20:56:21 +0000165#ifdef __cplusplus
166}
167#endif
168#endif /* !Py_PYSTATE_H */