blob: 353a102db307251c4d7db05342bd96b2090a8738 [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
Nicholas Bastinc69ebe82004-03-24 21:57:10 +000048#define PyTrace_C_CALL 4
49#define PyTrace_C_EXCEPTION 5
50#define PyTrace_C_RETURN 6
Fred Drake55fb6e02001-06-27 19:18:03 +000051
Guido van Rossuma027efa1997-05-05 20:56:21 +000052typedef struct _ts {
53
Fred Drake5eb6d4e2000-07-08 23:37:28 +000054 struct _ts *next;
55 PyInterpreterState *interp;
Guido van Rossuma027efa1997-05-05 20:56:21 +000056
Fred Drake5eb6d4e2000-07-08 23:37:28 +000057 struct _frame *frame;
58 int recursion_depth;
Fred Drake5eb6d4e2000-07-08 23:37:28 +000059 int tracing;
Fred Drake9e3ad782001-07-03 23:39:52 +000060 int use_tracing;
Guido van Rossuma027efa1997-05-05 20:56:21 +000061
Fred Drake55fb6e02001-06-27 19:18:03 +000062 Py_tracefunc c_profilefunc;
63 Py_tracefunc c_tracefunc;
64 PyObject *c_profileobj;
65 PyObject *c_traceobj;
Guido van Rossuma027efa1997-05-05 20:56:21 +000066
Fred Drake5eb6d4e2000-07-08 23:37:28 +000067 PyObject *curexc_type;
68 PyObject *curexc_value;
69 PyObject *curexc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +000070
Fred Drake5eb6d4e2000-07-08 23:37:28 +000071 PyObject *exc_type;
72 PyObject *exc_value;
73 PyObject *exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +000074
Fred Drake5eb6d4e2000-07-08 23:37:28 +000075 PyObject *dict;
Guido van Rossumee0a63b1998-04-13 20:24:05 +000076
Michael W. Hudson019a78e2002-11-08 12:53:11 +000077 int tick_counter;
Mark Hammond8d98d2c2003-04-19 15:41:53 +000078 int gilstate_counter;
Michael W. Hudson019a78e2002-11-08 12:53:11 +000079
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +000080 PyObject *async_exc; /* Asynchronous exception to raise */
81 long thread_id; /* Thread id where this tstate was created */
82
Fred Drake5eb6d4e2000-07-08 23:37:28 +000083 /* XXX signal handlers should also be here */
Guido van Rossuma027efa1997-05-05 20:56:21 +000084
85} PyThreadState;
86
87
Mark Hammond91a681d2002-08-12 07:21:58 +000088PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_New(void);
89PyAPI_FUNC(void) PyInterpreterState_Clear(PyInterpreterState *);
90PyAPI_FUNC(void) PyInterpreterState_Delete(PyInterpreterState *);
Guido van Rossuma027efa1997-05-05 20:56:21 +000091
Mark Hammond91a681d2002-08-12 07:21:58 +000092PyAPI_FUNC(PyThreadState *) PyThreadState_New(PyInterpreterState *);
93PyAPI_FUNC(void) PyThreadState_Clear(PyThreadState *);
94PyAPI_FUNC(void) PyThreadState_Delete(PyThreadState *);
Guido van Rossum29757862001-01-23 01:46:06 +000095#ifdef WITH_THREAD
Mark Hammond91a681d2002-08-12 07:21:58 +000096PyAPI_FUNC(void) PyThreadState_DeleteCurrent(void);
Guido van Rossum29757862001-01-23 01:46:06 +000097#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +000098
Mark Hammond91a681d2002-08-12 07:21:58 +000099PyAPI_FUNC(PyThreadState *) PyThreadState_Get(void);
100PyAPI_FUNC(PyThreadState *) PyThreadState_Swap(PyThreadState *);
101PyAPI_FUNC(PyObject *) PyThreadState_GetDict(void);
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000102PyAPI_FUNC(int) PyThreadState_SetAsyncExc(long, PyObject *);
Guido van Rossuma027efa1997-05-05 20:56:21 +0000103
Guido van Rossum275ea671998-12-21 18:28:10 +0000104
105/* Variable and macro for in-line access to current thread state */
106
Mark Hammond91a681d2002-08-12 07:21:58 +0000107PyAPI_DATA(PyThreadState *) _PyThreadState_Current;
Guido van Rossum275ea671998-12-21 18:28:10 +0000108
109#ifdef Py_DEBUG
110#define PyThreadState_GET() PyThreadState_Get()
111#else
112#define PyThreadState_GET() (_PyThreadState_Current)
113#endif
114
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000115typedef
116 enum {PyGILState_LOCKED, PyGILState_UNLOCKED}
117 PyGILState_STATE;
118
119/* Ensure that the current thread is ready to call the Python
120 C API, regardless of the current state of Python, or of its
121 thread lock. This may be called as many times as desired
122 by a thread so long as each call is matched with a call to
123 PyGILState_Release(). In general, other thread-state APIs may
124 be used between _Ensure() and _Release() calls, so long as the
125 thread-state is restored to its previous state before the Release().
126 For example, normal use of the Py_BEGIN_ALLOW_THREADS/
127 Py_END_ALLOW_THREADS macros are acceptable.
128
129 The return value is an opaque "handle" to the thread state when
Raymond Hettinger4eec95a2004-03-13 20:45:47 +0000130 PyGILState_Ensure() was called, and must be passed to
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000131 PyGILState_Release() to ensure Python is left in the same state. Even
132 though recursive calls are allowed, these handles can *not* be shared -
133 each unique call to PyGILState_Ensure must save the handle for its
134 call to PyGILState_Release.
135
136 When the function returns, the current thread will hold the GIL.
137
138 Failure is a fatal error.
139*/
140PyAPI_FUNC(PyGILState_STATE) PyGILState_Ensure(void);
141
142/* Release any resources previously acquired. After this call, Python's
143 state will be the same as it was prior to the corresponding
Raymond Hettinger4eec95a2004-03-13 20:45:47 +0000144 PyGILState_Ensure() call (but generally this state will be unknown to
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000145 the caller, hence the use of the GILState API.)
146
147 Every call to PyGILState_Ensure must be matched by a call to
148 PyGILState_Release on the same thread.
149*/
150PyAPI_FUNC(void) PyGILState_Release(PyGILState_STATE);
151
152/* Helper/diagnostic function - get the current thread state for
153 this thread. May return NULL if no GILState API has been used
154 on the current thread. Note the main thread always has such a
155 thread-state, even if no auto-thread-state call has been made
156 on the main thread.
157*/
158PyAPI_FUNC(PyThreadState *) PyGILState_GetThisThreadState(void);
159
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000160/* Routines for advanced debuggers, requested by David Beazley.
161 Don't use unless you know what you are doing! */
Mark Hammond91a681d2002-08-12 07:21:58 +0000162PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_Head(void);
163PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_Next(PyInterpreterState *);
164PyAPI_FUNC(PyThreadState *) PyInterpreterState_ThreadHead(PyInterpreterState *);
165PyAPI_FUNC(PyThreadState *) PyThreadState_Next(PyThreadState *);
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000166
Guido van Rossum6297a7a2003-02-19 15:53:17 +0000167typedef struct _frame *(*PyThreadFrameGetter)(PyThreadState *self_);
168
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000169/* hook for PyEval_GetFrame(), requested for Psyco */
Guido van Rossum6297a7a2003-02-19 15:53:17 +0000170PyAPI_DATA(PyThreadFrameGetter) _PyThreadState_GetFrame;
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000171
Guido van Rossuma027efa1997-05-05 20:56:21 +0000172#ifdef __cplusplus
173}
174#endif
175#endif /* !Py_PYSTATE_H */