blob: 34cad02c3a930d9a75a4738a91474fcbc0e5960e [file] [log] [blame]
Guido van Rossuma027efa1997-05-05 20:56:21 +00001/* Thread and interpreter state structures and their interfaces */
2
3
Fred Drake5eb6d4e2000-07-08 23:37:28 +00004#ifndef Py_PYSTATE_H
5#define Py_PYSTATE_H
6#ifdef __cplusplus
7extern "C" {
8#endif
9
Brett Cannon5c4de282016-09-07 11:16:41 -070010/* This limitation is for performance and simplicity. If needed it can be
11removed (with effort). */
12#define MAX_CO_EXTRA_USERS 255
13
Victor Stinner9bdd2de2018-11-27 23:54:59 +010014/* Forward declarations for PyFrameObject, PyThreadState
15 and PyInterpreterState */
Victor Stinner9bdd2de2018-11-27 23:54:59 +010016struct _ts;
17struct _is;
Guido van Rossuma027efa1997-05-05 20:56:21 +000018
Eric Snowbe3b2952019-02-23 11:35:52 -070019/* struct _ts is defined in cpython/pystate.h */
Victor Stinner9bdd2de2018-11-27 23:54:59 +010020typedef struct _ts PyThreadState;
Eric Snowbe3b2952019-02-23 11:35:52 -070021/* struct _is is defined in internal/pycore_pystate.h */
Martin v. Löwis4d0d4712010-12-03 20:14:31 +000022typedef struct _is PyInterpreterState;
Guido van Rossuma027efa1997-05-05 20:56:21 +000023
Eric Snowbe3b2952019-02-23 11:35:52 -070024PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_New(void);
25PyAPI_FUNC(void) PyInterpreterState_Clear(PyInterpreterState *);
26PyAPI_FUNC(void) PyInterpreterState_Delete(PyInterpreterState *);
Victor Stinner50b48572018-11-01 01:51:40 +010027
Victor Stinnerbe793732020-03-13 18:15:33 +010028#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03090000
29/* New in 3.9 */
30/* Get the current interpreter state.
31
32 Issue a fatal error if there no current Python thread state or no current
33 interpreter. It cannot return NULL.
34
35 The caller must hold the GIL. */
36PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_Get(void);
37#endif
38
Eric Snowd2fdd1f2019-03-15 17:47:43 -060039#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03080000
40/* New in 3.8 */
41PyAPI_FUNC(PyObject *) PyInterpreterState_GetDict(PyInterpreterState *);
42#endif
43
Eric Snowe3774162017-05-22 19:46:40 -070044#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03070000
45/* New in 3.7 */
Eric Snowbe3b2952019-02-23 11:35:52 -070046PyAPI_FUNC(int64_t) PyInterpreterState_GetID(PyInterpreterState *);
Eric Snowe3774162017-05-22 19:46:40 -070047#endif
Martin v. Löwis7800f752012-06-22 12:20:55 +020048#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000
Eric Snowd2fdd1f2019-03-15 17:47:43 -060049
50/* State unique per thread */
51
Martin v. Löwis7800f752012-06-22 12:20:55 +020052/* New in 3.3 */
53PyAPI_FUNC(int) PyState_AddModule(PyObject*, struct PyModuleDef*);
54PyAPI_FUNC(int) PyState_RemoveModule(struct PyModuleDef*);
55#endif
Martin v. Löwis1a214512008-06-11 05:26:20 +000056PyAPI_FUNC(PyObject*) PyState_FindModule(struct PyModuleDef*);
Guido van Rossuma027efa1997-05-05 20:56:21 +000057
Eric Snowbe3b2952019-02-23 11:35:52 -070058PyAPI_FUNC(PyThreadState *) PyThreadState_New(PyInterpreterState *);
59PyAPI_FUNC(void) PyThreadState_Clear(PyThreadState *);
60PyAPI_FUNC(void) PyThreadState_Delete(PyThreadState *);
Guido van Rossuma027efa1997-05-05 20:56:21 +000061
Victor Stinner50b48572018-11-01 01:51:40 +010062/* Get the current thread state.
63
64 When the current thread state is NULL, this issues a fatal error (so that
65 the caller needn't check for NULL).
66
67 The caller must hold the GIL.
68
69 See also PyThreadState_GET() and _PyThreadState_GET(). */
Eric Snowbe3b2952019-02-23 11:35:52 -070070PyAPI_FUNC(PyThreadState *) PyThreadState_Get(void);
Victor Stinnerbfd316e2016-01-20 11:12:38 +010071
Victor Stinner50b48572018-11-01 01:51:40 +010072/* Get the current Python thread state.
73
74 Macro using PyThreadState_Get() or _PyThreadState_GET() depending if
Victor Stinner621cebe2018-11-12 16:53:38 +010075 pycore_pystate.h is included or not (this header redefines the macro).
Victor Stinner50b48572018-11-01 01:51:40 +010076
77 If PyThreadState_Get() is used, issue a fatal error if the current thread
78 state is NULL.
79
80 See also PyThreadState_Get() and _PyThreadState_GET(). */
81#define PyThreadState_GET() PyThreadState_Get()
82
Eric Snowbe3b2952019-02-23 11:35:52 -070083PyAPI_FUNC(PyThreadState *) PyThreadState_Swap(PyThreadState *);
Mark Hammond91a681d2002-08-12 07:21:58 +000084PyAPI_FUNC(PyObject *) PyThreadState_GetDict(void);
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +020085PyAPI_FUNC(int) PyThreadState_SetAsyncExc(unsigned long, PyObject *);
Guido van Rossuma027efa1997-05-05 20:56:21 +000086
Victor Stinner8fb02b62020-03-13 23:38:08 +010087#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03090000
88/* New in 3.9 */
Victor Stinnerfd1e1a12020-03-20 15:51:45 +010089PyAPI_FUNC(PyInterpreterState*) PyThreadState_GetInterpreter(PyThreadState *tstate);
Victor Stinner7c59d7c2020-04-28 16:32:48 +020090PyAPI_FUNC(PyFrameObject*) PyThreadState_GetFrame(PyThreadState *tstate);
Victor Stinner5c3cda02020-03-25 21:23:53 +010091PyAPI_FUNC(uint64_t) PyThreadState_GetID(PyThreadState *tstate);
Victor Stinner8fb02b62020-03-13 23:38:08 +010092#endif
93
Tim Peters174175b2004-03-29 02:24:26 +000094typedef
Mark Hammond8d98d2c2003-04-19 15:41:53 +000095 enum {PyGILState_LOCKED, PyGILState_UNLOCKED}
96 PyGILState_STATE;
97
Victor Stinner8e4d4072011-04-26 23:34:58 +020098
Mark Hammond8d98d2c2003-04-19 15:41:53 +000099/* Ensure that the current thread is ready to call the Python
100 C API, regardless of the current state of Python, or of its
101 thread lock. This may be called as many times as desired
Tim Peters174175b2004-03-29 02:24:26 +0000102 by a thread so long as each call is matched with a call to
103 PyGILState_Release(). In general, other thread-state APIs may
104 be used between _Ensure() and _Release() calls, so long as the
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000105 thread-state is restored to its previous state before the Release().
106 For example, normal use of the Py_BEGIN_ALLOW_THREADS/
107 Py_END_ALLOW_THREADS macros are acceptable.
108
109 The return value is an opaque "handle" to the thread state when
Raymond Hettinger4eec95a2004-03-13 20:45:47 +0000110 PyGILState_Ensure() was called, and must be passed to
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000111 PyGILState_Release() to ensure Python is left in the same state. Even
Tim Peters174175b2004-03-29 02:24:26 +0000112 though recursive calls are allowed, these handles can *not* be shared -
113 each unique call to PyGILState_Ensure must save the handle for its
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000114 call to PyGILState_Release.
115
116 When the function returns, the current thread will hold the GIL.
117
118 Failure is a fatal error.
119*/
120PyAPI_FUNC(PyGILState_STATE) PyGILState_Ensure(void);
121
122/* Release any resources previously acquired. After this call, Python's
123 state will be the same as it was prior to the corresponding
Tim Peters174175b2004-03-29 02:24:26 +0000124 PyGILState_Ensure() call (but generally this state will be unknown to
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000125 the caller, hence the use of the GILState API.)
126
Tim Peters174175b2004-03-29 02:24:26 +0000127 Every call to PyGILState_Ensure must be matched by a call to
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000128 PyGILState_Release on the same thread.
129*/
130PyAPI_FUNC(void) PyGILState_Release(PyGILState_STATE);
131
132/* Helper/diagnostic function - get the current thread state for
Tim Peters174175b2004-03-29 02:24:26 +0000133 this thread. May return NULL if no GILState API has been used
Sandro Tosi61baee02011-08-08 00:16:54 +0200134 on the current thread. Note that the main thread always has such a
Tim Peters174175b2004-03-29 02:24:26 +0000135 thread-state, even if no auto-thread-state call has been made
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000136 on the main thread.
137*/
Eric Snowbe3b2952019-02-23 11:35:52 -0700138PyAPI_FUNC(PyThreadState *) PyGILState_GetThisThreadState(void);
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000139
Victor Stinnerf2a9d5c2018-11-27 00:20:00 +0100140
Martin v. Löwis1c0689c2014-01-03 21:36:49 +0100141#ifndef Py_LIMITED_API
Victor Stinnerf2a9d5c2018-11-27 00:20:00 +0100142# define Py_CPYTHON_PYSTATE_H
143# include "cpython/pystate.h"
144# undef Py_CPYTHON_PYSTATE_H
Martin v. Löwis4d0d4712010-12-03 20:14:31 +0000145#endif
Guido van Rossum6297a7a2003-02-19 15:53:17 +0000146
Guido van Rossuma027efa1997-05-05 20:56:21 +0000147#ifdef __cplusplus
148}
149#endif
150#endif /* !Py_PYSTATE_H */