blob: ff3596908c4e634a872860b58e7a4e76d8a2cfae [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
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +000077 PyObject *async_exc; /* Asynchronous exception to raise */
78 long thread_id; /* Thread id where this tstate was created */
79
Fred Drake5eb6d4e2000-07-08 23:37:28 +000080 /* XXX signal handlers should also be here */
Guido van Rossuma027efa1997-05-05 20:56:21 +000081
82} PyThreadState;
83
84
Mark Hammond91a681d2002-08-12 07:21:58 +000085PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_New(void);
86PyAPI_FUNC(void) PyInterpreterState_Clear(PyInterpreterState *);
87PyAPI_FUNC(void) PyInterpreterState_Delete(PyInterpreterState *);
Guido van Rossuma027efa1997-05-05 20:56:21 +000088
Mark Hammond91a681d2002-08-12 07:21:58 +000089PyAPI_FUNC(PyThreadState *) PyThreadState_New(PyInterpreterState *);
90PyAPI_FUNC(void) PyThreadState_Clear(PyThreadState *);
91PyAPI_FUNC(void) PyThreadState_Delete(PyThreadState *);
Guido van Rossum29757862001-01-23 01:46:06 +000092#ifdef WITH_THREAD
Mark Hammond91a681d2002-08-12 07:21:58 +000093PyAPI_FUNC(void) PyThreadState_DeleteCurrent(void);
Guido van Rossum29757862001-01-23 01:46:06 +000094#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +000095
Mark Hammond91a681d2002-08-12 07:21:58 +000096PyAPI_FUNC(PyThreadState *) PyThreadState_Get(void);
97PyAPI_FUNC(PyThreadState *) PyThreadState_Swap(PyThreadState *);
98PyAPI_FUNC(PyObject *) PyThreadState_GetDict(void);
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +000099PyAPI_FUNC(int) PyThreadState_SetAsyncExc(long, PyObject *);
Guido van Rossuma027efa1997-05-05 20:56:21 +0000100
Guido van Rossum275ea671998-12-21 18:28:10 +0000101
102/* Variable and macro for in-line access to current thread state */
103
Mark Hammond91a681d2002-08-12 07:21:58 +0000104PyAPI_DATA(PyThreadState *) _PyThreadState_Current;
Guido van Rossum275ea671998-12-21 18:28:10 +0000105
106#ifdef Py_DEBUG
107#define PyThreadState_GET() PyThreadState_Get()
108#else
109#define PyThreadState_GET() (_PyThreadState_Current)
110#endif
111
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000112typedef
113 enum {PyGILState_LOCKED, PyGILState_UNLOCKED}
114 PyGILState_STATE;
115
116/* Ensure that the current thread is ready to call the Python
117 C API, regardless of the current state of Python, or of its
118 thread lock. This may be called as many times as desired
119 by a thread so long as each call is matched with a call to
120 PyGILState_Release(). In general, other thread-state APIs may
121 be used between _Ensure() and _Release() calls, so long as the
122 thread-state is restored to its previous state before the Release().
123 For example, normal use of the Py_BEGIN_ALLOW_THREADS/
124 Py_END_ALLOW_THREADS macros are acceptable.
125
126 The return value is an opaque "handle" to the thread state when
Raymond Hettinger4eec95a2004-03-13 20:45:47 +0000127 PyGILState_Ensure() was called, and must be passed to
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000128 PyGILState_Release() to ensure Python is left in the same state. Even
129 though recursive calls are allowed, these handles can *not* be shared -
130 each unique call to PyGILState_Ensure must save the handle for its
131 call to PyGILState_Release.
132
133 When the function returns, the current thread will hold the GIL.
134
135 Failure is a fatal error.
136*/
137PyAPI_FUNC(PyGILState_STATE) PyGILState_Ensure(void);
138
139/* Release any resources previously acquired. After this call, Python's
140 state will be the same as it was prior to the corresponding
Raymond Hettinger4eec95a2004-03-13 20:45:47 +0000141 PyGILState_Ensure() call (but generally this state will be unknown to
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000142 the caller, hence the use of the GILState API.)
143
144 Every call to PyGILState_Ensure must be matched by a call to
145 PyGILState_Release on the same thread.
146*/
147PyAPI_FUNC(void) PyGILState_Release(PyGILState_STATE);
148
149/* Helper/diagnostic function - get the current thread state for
150 this thread. May return NULL if no GILState API has been used
151 on the current thread. Note the main thread always has such a
152 thread-state, even if no auto-thread-state call has been made
153 on the main thread.
154*/
155PyAPI_FUNC(PyThreadState *) PyGILState_GetThisThreadState(void);
156
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000157/* Routines for advanced debuggers, requested by David Beazley.
158 Don't use unless you know what you are doing! */
Mark Hammond91a681d2002-08-12 07:21:58 +0000159PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_Head(void);
160PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_Next(PyInterpreterState *);
161PyAPI_FUNC(PyThreadState *) PyInterpreterState_ThreadHead(PyInterpreterState *);
162PyAPI_FUNC(PyThreadState *) PyThreadState_Next(PyThreadState *);
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000163
Guido van Rossum6297a7a2003-02-19 15:53:17 +0000164typedef struct _frame *(*PyThreadFrameGetter)(PyThreadState *self_);
165
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000166/* hook for PyEval_GetFrame(), requested for Psyco */
Guido van Rossum6297a7a2003-02-19 15:53:17 +0000167PyAPI_DATA(PyThreadFrameGetter) _PyThreadState_GetFrame;
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000168
Guido van Rossuma027efa1997-05-05 20:56:21 +0000169#ifdef __cplusplus
170}
171#endif
172#endif /* !Py_PYSTATE_H */