blob: 609f9c6ee035dde57ef8ea82f7a65daa407e4aff [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
Eric Snow4c6955e2018-02-16 18:53:40 -070010#include "pythread.h"
11
Brett Cannon5c4de282016-09-07 11:16:41 -070012/* This limitation is for performance and simplicity. If needed it can be
13removed (with effort). */
14#define MAX_CO_EXTRA_USERS 255
15
Guido van Rossuma027efa1997-05-05 20:56:21 +000016/* State shared between threads */
17
Guido van Rossum29e46a91997-08-02 02:56:48 +000018struct _ts; /* Forward */
19struct _is; /* Forward */
Brett Cannon3cebf932016-09-05 15:33:46 -070020struct _frame; /* Forward declaration for PyFrameObject. */
Guido van Rossum29e46a91997-08-02 02:56:48 +000021
Martin v. Löwis4d0d4712010-12-03 20:14:31 +000022#ifdef Py_LIMITED_API
23typedef struct _is PyInterpreterState;
24#else
Brett Cannon3cebf932016-09-05 15:33:46 -070025typedef PyObject* (*_PyFrameEvalFunction)(struct _frame *, int);
26
Eric Snow1abcf672017-05-23 21:46:51 -070027
28typedef struct {
Victor Stinner9cfc0022017-12-20 19:36:46 +010029 int install_signal_handlers; /* Install signal handlers? -1 means unset */
Victor Stinner8ded5b82018-01-24 17:03:28 +010030
Victor Stinnerd19d8d52018-07-24 13:55:48 +020031 int ignore_environment; /* -E, Py_IgnoreEnvironmentFlag, -1 means unset */
Victor Stinner25420fe2017-11-20 18:12:22 -080032 int use_hash_seed; /* PYTHONHASHSEED=x */
Eric Snow1abcf672017-05-23 21:46:51 -070033 unsigned long hash_seed;
Victor Stinner25420fe2017-11-20 18:12:22 -080034 const char *allocator; /* Memory allocator: _PyMem_SetupAllocators() */
Victor Stinner8ded5b82018-01-24 17:03:28 +010035 int dev_mode; /* PYTHONDEVMODE, -X dev */
36 int faulthandler; /* PYTHONFAULTHANDLER, -X faulthandler */
37 int tracemalloc; /* PYTHONTRACEMALLOC, -X tracemalloc=N */
38 int import_time; /* PYTHONPROFILEIMPORTTIME, -X importtime */
Victor Stinner25420fe2017-11-20 18:12:22 -080039 int show_ref_count; /* -X showrefcount */
40 int show_alloc_count; /* -X showalloccount */
Victor Stinner6bf992a2017-12-06 17:26:10 +010041 int dump_refs; /* PYTHONDUMPREFS */
42 int malloc_stats; /* PYTHONMALLOCSTATS */
Victor Stinner94540602017-12-16 04:54:22 +010043 int coerce_c_locale; /* PYTHONCOERCECLOCALE, -1 means unknown */
44 int coerce_c_locale_warn; /* PYTHONCOERCECLOCALE=warn */
Victor Stinner8ded5b82018-01-24 17:03:28 +010045 int utf8_mode; /* PYTHONUTF8, -X utf8; -1 means unknown */
Carl Meyerb193fa92018-06-15 22:40:56 -060046 wchar_t *pycache_prefix; /* PYTHONPYCACHEPREFIX, -X pycache_prefix=PATH */
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +010047
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +010048 wchar_t *program_name; /* Program name, see also Py_GetProgramName() */
Victor Stinnerc4bca952017-12-19 23:48:17 +010049 int argc; /* Number of command line arguments,
50 -1 means unset */
Victor Stinnerca719ac2017-12-20 18:00:19 +010051 wchar_t **argv; /* Command line arguments */
52 wchar_t *program; /* argv[0] or "" */
53
54 int nxoption; /* Number of -X options */
55 wchar_t **xoptions; /* -X options */
56
57 int nwarnoption; /* Number of warnings options */
58 wchar_t **warnoptions; /* Warnings options */
Victor Stinner8ded5b82018-01-24 17:03:28 +010059
60 /* Path configuration inputs */
61 wchar_t *module_search_path_env; /* PYTHONPATH environment variable */
62 wchar_t *home; /* PYTHONHOME environment variable,
63 see also Py_SetPythonHome(). */
64
65 /* Path configuration outputs */
66 int nmodule_search_path; /* Number of sys.path paths,
67 -1 means unset */
68 wchar_t **module_search_paths; /* sys.path paths */
69 wchar_t *executable; /* sys.executable */
70 wchar_t *prefix; /* sys.prefix */
71 wchar_t *base_prefix; /* sys.base_prefix */
72 wchar_t *exec_prefix; /* sys.exec_prefix */
73 wchar_t *base_exec_prefix; /* sys.base_exec_prefix */
Victor Stinnerb1147e42018-07-21 02:06:16 +020074#ifdef MS_WINDOWS
75 wchar_t *dll_path; /* Windows DLL path */
76#endif
Victor Stinner8ded5b82018-01-24 17:03:28 +010077
Victor Stinnerd19d8d52018-07-24 13:55:48 +020078 /* If greater than 0, enable isolated mode: sys.path contains
79 neither the script's directory nor the user's site-packages directory.
80
81 Set to 1 by the -I command line option. If set to -1 (default), inherit
82 Py_IsolatedFlag value. */
83 int isolated;
84
85 /* If equal to zero, disable the import of the module site and the
86 site-dependent manipulations of sys.path that it entails. Also disable
87 these manipulations if site is explicitly imported later (call
88 site.main() if you want them to be triggered).
89
90 Set to 0 by the -S command line option. If set to -1 (default), set to
91 the negative value of Py_NoSiteFlag. */
92 int site_import;
93
94 /* --- Private fields -------- */
95
96 /* Install importlib? If set to 0, importlib is not initialized at all.
97 Needed by freeze_importlib: see install_importlib argument of
98 _Py_InitializeEx_Private(). */
99 int _install_importlib;
Eric Snow1abcf672017-05-23 21:46:51 -0700100} _PyCoreConfig;
101
Victor Stinner94540602017-12-16 04:54:22 +0100102#define _PyCoreConfig_INIT \
Victor Stinnerc4bca952017-12-19 23:48:17 +0100103 (_PyCoreConfig){ \
Victor Stinner9cfc0022017-12-20 19:36:46 +0100104 .install_signal_handlers = -1, \
Victor Stinnerd19d8d52018-07-24 13:55:48 +0200105 .ignore_environment = -1, \
Victor Stinnerc4bca952017-12-19 23:48:17 +0100106 .use_hash_seed = -1, \
107 .coerce_c_locale = -1, \
108 .utf8_mode = -1, \
Victor Stinner8ded5b82018-01-24 17:03:28 +0100109 .argc = -1, \
Victor Stinnerd19d8d52018-07-24 13:55:48 +0200110 .nmodule_search_path = -1, \
111 .isolated = -1, \
112 .site_import = -1, \
113 ._install_importlib = 1}
Victor Stinner33c377e2017-12-05 15:12:41 +0100114/* Note: _PyCoreConfig_INIT sets other fields to 0/NULL */
Eric Snow1abcf672017-05-23 21:46:51 -0700115
Eric Snowc7ec9982017-05-23 23:00:52 -0700116/* Placeholders while working on the new configuration API
117 *
118 * See PEP 432 for final anticipated contents
Eric Snowc7ec9982017-05-23 23:00:52 -0700119 */
120typedef struct {
Victor Stinner9cfc0022017-12-20 19:36:46 +0100121 int install_signal_handlers; /* Install signal handlers? -1 means unset */
Victor Stinner41264f12017-12-15 02:05:29 +0100122 PyObject *argv; /* sys.argv list, can be NULL */
123 PyObject *executable; /* sys.executable str */
124 PyObject *prefix; /* sys.prefix str */
125 PyObject *base_prefix; /* sys.base_prefix str, can be NULL */
126 PyObject *exec_prefix; /* sys.exec_prefix str */
127 PyObject *base_exec_prefix; /* sys.base_exec_prefix str, can be NULL */
128 PyObject *warnoptions; /* sys.warnoptions list, can be NULL */
129 PyObject *xoptions; /* sys._xoptions dict, can be NULL */
130 PyObject *module_search_path; /* sys.path list */
Carl Meyerb193fa92018-06-15 22:40:56 -0600131 PyObject *pycache_prefix; /* sys.pycache_prefix str, can be NULL */
Eric Snowc7ec9982017-05-23 23:00:52 -0700132} _PyMainInterpreterConfig;
133
Victor Stinnerd4341102017-11-23 00:12:09 +0100134#define _PyMainInterpreterConfig_INIT \
Victor Stinner33c377e2017-12-05 15:12:41 +0100135 (_PyMainInterpreterConfig){.install_signal_handlers = -1}
136/* Note: _PyMainInterpreterConfig_INIT sets other fields to 0/NULL */
Eric Snowc7ec9982017-05-23 23:00:52 -0700137
Guido van Rossuma027efa1997-05-05 20:56:21 +0000138typedef struct _is {
139
Fred Drake5eb6d4e2000-07-08 23:37:28 +0000140 struct _is *next;
141 struct _ts *tstate_head;
Guido van Rossum29e46a91997-08-02 02:56:48 +0000142
Eric Snowe3774162017-05-22 19:46:40 -0700143 int64_t id;
Eric Snow4c6955e2018-02-16 18:53:40 -0700144 int64_t id_refcount;
145 PyThread_type_lock id_mutex;
Eric Snowe3774162017-05-22 19:46:40 -0700146
Eric Snow93c92f72017-09-13 23:46:04 -0700147 PyObject *modules;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000148 PyObject *modules_by_index;
Fred Drake5eb6d4e2000-07-08 23:37:28 +0000149 PyObject *sysdict;
150 PyObject *builtins;
Brett Cannonfd074152012-04-14 14:10:13 -0400151 PyObject *importlib;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000152
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600153 /* Used in Python/sysmodule.c. */
154 int check_interval;
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600155
156 /* Used in Modules/_threadmodule.c. */
157 long num_threads;
158 /* Support for runtime thread stack size tuning.
159 A value of 0 means using the platform's default stack size
160 or the size specified by the THREAD_STACK_SIZE macro. */
161 /* Used in Python/thread.c. */
162 size_t pythread_stacksize;
163
Gustavo Niemeyer5ddd4c32003-03-19 00:35:36 +0000164 PyObject *codec_search_path;
165 PyObject *codec_search_cache;
166 PyObject *codec_error_registry;
Christian Heimes6a27efa2008-10-30 21:48:26 +0000167 int codecs_initialized;
Victor Stinner793b5312011-04-27 00:24:21 +0200168 int fscodec_initialized;
Gustavo Niemeyer5ddd4c32003-03-19 00:35:36 +0000169
Eric Snow1abcf672017-05-23 21:46:51 -0700170 _PyCoreConfig core_config;
Eric Snowc7ec9982017-05-23 23:00:52 -0700171 _PyMainInterpreterConfig config;
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000172#ifdef HAVE_DLOPEN
173 int dlopenflags;
174#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000175
Serhiy Storchaka87a5c512014-02-10 18:21:34 +0200176 PyObject *builtins_copy;
Serhiy Storchaka133138a2016-08-02 22:51:21 +0300177 PyObject *import_func;
Brett Cannon3cebf932016-09-05 15:33:46 -0700178 /* Initialized to PyEval_EvalFrameDefault(). */
179 _PyFrameEvalFunction eval_frame;
Dino Viehlandf3cffd22017-06-21 14:44:36 -0700180
181 Py_ssize_t co_extra_user_count;
182 freefunc co_extra_freefuncs[MAX_CO_EXTRA_USERS];
183
Antoine Pitrou346cbd32017-05-27 17:50:54 +0200184#ifdef HAVE_FORK
185 PyObject *before_forkers;
186 PyObject *after_forkers_parent;
187 PyObject *after_forkers_child;
188#endif
Marcel Plch776407f2017-12-20 11:17:58 +0100189 /* AtExit module */
190 void (*pyexitfunc)(PyObject *);
191 PyObject *pyexitmodule;
Yury Selivanovf23746a2018-01-22 19:11:18 -0500192
193 uint64_t tstate_next_unique_id;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000194} PyInterpreterState;
Victor Stinner6bf992a2017-12-06 17:26:10 +0100195#endif /* !Py_LIMITED_API */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000196
197
198/* State unique per thread */
199
Martin v. Löwis4d0d4712010-12-03 20:14:31 +0000200#ifndef Py_LIMITED_API
Fred Drake55fb6e02001-06-27 19:18:03 +0000201/* Py_tracefunc return -1 when raising an exception, or 0 for success. */
202typedef int (*Py_tracefunc)(PyObject *, struct _frame *, int, PyObject *);
203
Nick Coghlan5a851672017-09-08 10:14:16 +1000204/* The following values are used for 'what' for tracefunc functions
205 *
206 * To add a new kind of trace event, also update "trace_init" in
207 * Python/sysmodule.c to define the Python level event name
208 */
Fred Drake55fb6e02001-06-27 19:18:03 +0000209#define PyTrace_CALL 0
210#define PyTrace_EXCEPTION 1
211#define PyTrace_LINE 2
212#define PyTrace_RETURN 3
Nicholas Bastinc69ebe82004-03-24 21:57:10 +0000213#define PyTrace_C_CALL 4
214#define PyTrace_C_EXCEPTION 5
215#define PyTrace_C_RETURN 6
Nick Coghlan5a851672017-09-08 10:14:16 +1000216#define PyTrace_OPCODE 7
Victor Stinner6bf992a2017-12-06 17:26:10 +0100217#endif /* Py_LIMITED_API */
Fred Drake55fb6e02001-06-27 19:18:03 +0000218
Martin v. Löwis4d0d4712010-12-03 20:14:31 +0000219#ifdef Py_LIMITED_API
220typedef struct _ts PyThreadState;
221#else
Mark Shannonae3087c2017-10-22 22:41:51 +0100222
223typedef struct _err_stackitem {
Serhiy Storchakabdf42982017-10-26 16:59:40 +0300224 /* This struct represents an entry on the exception stack, which is a
225 * per-coroutine state. (Coroutine in the computer science sense,
Mark Shannonae3087c2017-10-22 22:41:51 +0100226 * including the thread and generators).
227 * This ensures that the exception state is not impacted by "yields"
228 * from an except handler.
229 */
230 PyObject *exc_type, *exc_value, *exc_traceback;
231
232 struct _err_stackitem *previous_item;
233
234} _PyErr_StackItem;
235
236
Guido van Rossuma027efa1997-05-05 20:56:21 +0000237typedef struct _ts {
Brett Cannon55fa66d2005-06-25 07:07:35 +0000238 /* See Python/ceval.c for comments explaining most fields */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000239
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200240 struct _ts *prev;
Fred Drake5eb6d4e2000-07-08 23:37:28 +0000241 struct _ts *next;
242 PyInterpreterState *interp;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000243
Fred Drake5eb6d4e2000-07-08 23:37:28 +0000244 struct _frame *frame;
245 int recursion_depth;
Martin v. Löwis5b222132007-06-10 09:51:05 +0000246 char overflowed; /* The stack has overflowed. Allow 50 more calls
Victor Stinner8e4d4072011-04-26 23:34:58 +0200247 to handle the runtime error. */
248 char recursion_critical; /* The current calls must not cause
249 a stack overflow. */
pdox18967932017-10-25 23:03:01 -0700250 int stackcheck_counter;
251
Brett Cannon55fa66d2005-06-25 07:07:35 +0000252 /* 'tracing' keeps track of the execution depth when tracing/profiling.
253 This is to prevent the actual trace/profile code from being recorded in
254 the trace/profile. */
Fred Drake5eb6d4e2000-07-08 23:37:28 +0000255 int tracing;
Fred Drake9e3ad782001-07-03 23:39:52 +0000256 int use_tracing;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000257
Fred Drake55fb6e02001-06-27 19:18:03 +0000258 Py_tracefunc c_profilefunc;
259 Py_tracefunc c_tracefunc;
260 PyObject *c_profileobj;
261 PyObject *c_traceobj;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000262
Mark Shannonae3087c2017-10-22 22:41:51 +0100263 /* The exception currently being raised */
Fred Drake5eb6d4e2000-07-08 23:37:28 +0000264 PyObject *curexc_type;
265 PyObject *curexc_value;
266 PyObject *curexc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000267
Mark Shannonae3087c2017-10-22 22:41:51 +0100268 /* The exception currently being handled, if no coroutines/generators
269 * are present. Always last element on the stack referred to be exc_info.
270 */
271 _PyErr_StackItem exc_state;
272
273 /* Pointer to the top of the stack of the exceptions currently
274 * being handled */
275 _PyErr_StackItem *exc_info;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000276
Brett Cannon55fa66d2005-06-25 07:07:35 +0000277 PyObject *dict; /* Stores per-thread state */
Guido van Rossumee0a63b1998-04-13 20:24:05 +0000278
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000279 int gilstate_counter;
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000280
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000281 PyObject *async_exc; /* Asynchronous exception to raise */
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200282 unsigned long thread_id; /* Thread id where this tstate was created */
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000283
Antoine Pitrou2b0218a2012-09-06 00:59:49 +0200284 int trash_delete_nesting;
285 PyObject *trash_delete_later;
286
Antoine Pitrou7b476992013-09-07 23:38:37 +0200287 /* Called when a thread state is deleted normally, but not when it
288 * is destroyed after fork().
289 * Pain: to prevent rare but fatal shutdown errors (issue 18808),
290 * Thread.join() must wait for the join'ed thread's tstate to be unlinked
291 * from the tstate chain. That happens at the end of a thread's life,
292 * in pystate.c.
293 * The obvious way doesn't quite work: create a lock which the tstate
294 * unlinking code releases, and have Thread.join() wait to acquire that
295 * lock. The problem is that we _are_ at the end of the thread's life:
296 * if the thread holds the last reference to the lock, decref'ing the
297 * lock will delete the lock, and that may trigger arbitrary Python code
298 * if there's a weakref, with a callback, to the lock. But by this time
299 * _PyThreadState_Current is already NULL, so only the simplest of C code
300 * can be allowed to run (in particular it must not be possible to
301 * release the GIL).
302 * So instead of holding the lock directly, the tstate holds a weakref to
303 * the lock: that's the value of on_delete_data below. Decref'ing a
304 * weakref is harmless.
305 * on_delete points to _threadmodule.c's static release_sentinel() function.
306 * After the tstate is unlinked, release_sentinel is called with the
307 * weakref-to-lock (on_delete_data) argument, and release_sentinel releases
308 * the indirectly held lock.
309 */
310 void (*on_delete)(void *);
311 void *on_delete_data;
312
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -0800313 int coroutine_origin_tracking_depth;
314
Yury Selivanov75445082015-05-11 22:57:16 -0400315 PyObject *coroutine_wrapper;
Yury Selivanovaab3c4a2015-06-02 18:43:51 -0400316 int in_coroutine_wrapper;
Yury Selivanov75445082015-05-11 22:57:16 -0400317
Yury Selivanoveb636452016-09-08 22:01:51 -0700318 PyObject *async_gen_firstiter;
319 PyObject *async_gen_finalizer;
320
Yury Selivanovf23746a2018-01-22 19:11:18 -0500321 PyObject *context;
322 uint64_t context_ver;
323
324 /* Unique thread state id. */
325 uint64_t id;
326
Fred Drake5eb6d4e2000-07-08 23:37:28 +0000327 /* XXX signal handlers should also be here */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000328
329} PyThreadState;
Victor Stinner6bf992a2017-12-06 17:26:10 +0100330#endif /* !Py_LIMITED_API */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000331
332
Mark Hammond91a681d2002-08-12 07:21:58 +0000333PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_New(void);
334PyAPI_FUNC(void) PyInterpreterState_Clear(PyInterpreterState *);
335PyAPI_FUNC(void) PyInterpreterState_Delete(PyInterpreterState *);
Eric Snowe3774162017-05-22 19:46:40 -0700336#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03070000
337/* New in 3.7 */
338PyAPI_FUNC(int64_t) PyInterpreterState_GetID(PyInterpreterState *);
339#endif
Serhiy Storchaka9fab79b2016-09-11 11:03:14 +0300340#ifndef Py_LIMITED_API
Martin v. Löwis1a214512008-06-11 05:26:20 +0000341PyAPI_FUNC(int) _PyState_AddModule(PyObject*, struct PyModuleDef*);
Serhiy Storchaka9fab79b2016-09-11 11:03:14 +0300342#endif /* !Py_LIMITED_API */
Martin v. Löwis7800f752012-06-22 12:20:55 +0200343#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000
344/* New in 3.3 */
345PyAPI_FUNC(int) PyState_AddModule(PyObject*, struct PyModuleDef*);
346PyAPI_FUNC(int) PyState_RemoveModule(struct PyModuleDef*);
347#endif
Martin v. Löwis1a214512008-06-11 05:26:20 +0000348PyAPI_FUNC(PyObject*) PyState_FindModule(struct PyModuleDef*);
Antoine Pitrou40322e62013-08-11 00:30:09 +0200349#ifndef Py_LIMITED_API
350PyAPI_FUNC(void) _PyState_ClearModules(void);
351#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000352
Mark Hammond91a681d2002-08-12 07:21:58 +0000353PyAPI_FUNC(PyThreadState *) PyThreadState_New(PyInterpreterState *);
Serhiy Storchaka9fab79b2016-09-11 11:03:14 +0300354#ifndef Py_LIMITED_API
Victor Stinner45b9be52010-03-03 23:28:07 +0000355PyAPI_FUNC(PyThreadState *) _PyThreadState_Prealloc(PyInterpreterState *);
356PyAPI_FUNC(void) _PyThreadState_Init(PyThreadState *);
Serhiy Storchaka9fab79b2016-09-11 11:03:14 +0300357#endif /* !Py_LIMITED_API */
Mark Hammond91a681d2002-08-12 07:21:58 +0000358PyAPI_FUNC(void) PyThreadState_Clear(PyThreadState *);
359PyAPI_FUNC(void) PyThreadState_Delete(PyThreadState *);
Serhiy Storchaka9fab79b2016-09-11 11:03:14 +0300360#ifndef Py_LIMITED_API
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200361PyAPI_FUNC(void) _PyThreadState_DeleteExcept(PyThreadState *tstate);
Serhiy Storchaka9fab79b2016-09-11 11:03:14 +0300362#endif /* !Py_LIMITED_API */
Mark Hammond91a681d2002-08-12 07:21:58 +0000363PyAPI_FUNC(void) PyThreadState_DeleteCurrent(void);
Serhiy Storchaka9fab79b2016-09-11 11:03:14 +0300364#ifndef Py_LIMITED_API
Antoine Pitrou0c759fe2011-04-27 19:28:05 +0200365PyAPI_FUNC(void) _PyGILState_Reinit(void);
Serhiy Storchaka9fab79b2016-09-11 11:03:14 +0300366#endif /* !Py_LIMITED_API */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000367
Victor Stinnerbfd316e2016-01-20 11:12:38 +0100368/* Return the current thread state. The global interpreter lock must be held.
369 * When the current thread state is NULL, this issues a fatal error (so that
370 * the caller needn't check for NULL). */
Mark Hammond91a681d2002-08-12 07:21:58 +0000371PyAPI_FUNC(PyThreadState *) PyThreadState_Get(void);
Victor Stinnerbfd316e2016-01-20 11:12:38 +0100372
Serhiy Storchaka9fab79b2016-09-11 11:03:14 +0300373#ifndef Py_LIMITED_API
Victor Stinnerbfd316e2016-01-20 11:12:38 +0100374/* Similar to PyThreadState_Get(), but don't issue a fatal error
375 * if it is NULL. */
376PyAPI_FUNC(PyThreadState *) _PyThreadState_UncheckedGet(void);
Serhiy Storchaka9fab79b2016-09-11 11:03:14 +0300377#endif /* !Py_LIMITED_API */
Victor Stinnerbfd316e2016-01-20 11:12:38 +0100378
Mark Hammond91a681d2002-08-12 07:21:58 +0000379PyAPI_FUNC(PyThreadState *) PyThreadState_Swap(PyThreadState *);
380PyAPI_FUNC(PyObject *) PyThreadState_GetDict(void);
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200381PyAPI_FUNC(int) PyThreadState_SetAsyncExc(unsigned long, PyObject *);
Guido van Rossuma027efa1997-05-05 20:56:21 +0000382
Guido van Rossum275ea671998-12-21 18:28:10 +0000383
384/* Variable and macro for in-line access to current thread state */
385
Jeffrey Yasskin39370832010-05-03 19:29:34 +0000386/* Assuming the current thread holds the GIL, this is the
Victor Stinner6df29ad2015-09-18 15:06:34 +0200387 PyThreadState for the current thread. */
388#ifdef Py_BUILD_CORE
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600389# define _PyThreadState_Current _PyRuntime.gilstate.tstate_current
Victor Stinner6df29ad2015-09-18 15:06:34 +0200390# define PyThreadState_GET() \
391 ((PyThreadState*)_Py_atomic_load_relaxed(&_PyThreadState_Current))
Guido van Rossum275ea671998-12-21 18:28:10 +0000392#else
Victor Stinner6df29ad2015-09-18 15:06:34 +0200393# define PyThreadState_GET() PyThreadState_Get()
Guido van Rossum275ea671998-12-21 18:28:10 +0000394#endif
395
Tim Peters174175b2004-03-29 02:24:26 +0000396typedef
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000397 enum {PyGILState_LOCKED, PyGILState_UNLOCKED}
398 PyGILState_STATE;
399
Victor Stinner8e4d4072011-04-26 23:34:58 +0200400
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000401/* Ensure that the current thread is ready to call the Python
402 C API, regardless of the current state of Python, or of its
403 thread lock. This may be called as many times as desired
Tim Peters174175b2004-03-29 02:24:26 +0000404 by a thread so long as each call is matched with a call to
405 PyGILState_Release(). In general, other thread-state APIs may
406 be used between _Ensure() and _Release() calls, so long as the
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000407 thread-state is restored to its previous state before the Release().
408 For example, normal use of the Py_BEGIN_ALLOW_THREADS/
409 Py_END_ALLOW_THREADS macros are acceptable.
410
411 The return value is an opaque "handle" to the thread state when
Raymond Hettinger4eec95a2004-03-13 20:45:47 +0000412 PyGILState_Ensure() was called, and must be passed to
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000413 PyGILState_Release() to ensure Python is left in the same state. Even
Tim Peters174175b2004-03-29 02:24:26 +0000414 though recursive calls are allowed, these handles can *not* be shared -
415 each unique call to PyGILState_Ensure must save the handle for its
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000416 call to PyGILState_Release.
417
418 When the function returns, the current thread will hold the GIL.
419
420 Failure is a fatal error.
421*/
422PyAPI_FUNC(PyGILState_STATE) PyGILState_Ensure(void);
423
424/* Release any resources previously acquired. After this call, Python's
425 state will be the same as it was prior to the corresponding
Tim Peters174175b2004-03-29 02:24:26 +0000426 PyGILState_Ensure() call (but generally this state will be unknown to
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000427 the caller, hence the use of the GILState API.)
428
Tim Peters174175b2004-03-29 02:24:26 +0000429 Every call to PyGILState_Ensure must be matched by a call to
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000430 PyGILState_Release on the same thread.
431*/
432PyAPI_FUNC(void) PyGILState_Release(PyGILState_STATE);
433
434/* Helper/diagnostic function - get the current thread state for
Tim Peters174175b2004-03-29 02:24:26 +0000435 this thread. May return NULL if no GILState API has been used
Sandro Tosi61baee02011-08-08 00:16:54 +0200436 on the current thread. Note that the main thread always has such a
Tim Peters174175b2004-03-29 02:24:26 +0000437 thread-state, even if no auto-thread-state call has been made
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000438 on the main thread.
439*/
440PyAPI_FUNC(PyThreadState *) PyGILState_GetThisThreadState(void);
441
Martin v. Löwis1c0689c2014-01-03 21:36:49 +0100442#ifndef Py_LIMITED_API
Victor Stinner861d9ab2016-03-16 22:45:24 +0100443/* Helper/diagnostic function - return 1 if the current thread
444 currently holds the GIL, 0 otherwise.
445
446 The function returns 1 if _PyGILState_check_enabled is non-zero. */
Kristján Valur Jónsson684cd0e2013-03-23 03:36:16 -0700447PyAPI_FUNC(int) PyGILState_Check(void);
Victor Stinner861d9ab2016-03-16 22:45:24 +0100448
449/* Unsafe function to get the single PyInterpreterState used by this process'
450 GILState implementation.
451
452 Return NULL before _PyGILState_Init() is called and after _PyGILState_Fini()
453 is called. */
454PyAPI_FUNC(PyInterpreterState *) _PyGILState_GetInterpreterStateUnsafe(void);
Victor Stinner6bf992a2017-12-06 17:26:10 +0100455#endif /* !Py_LIMITED_API */
Kristján Valur Jónsson684cd0e2013-03-23 03:36:16 -0700456
Victor Stinner8e4d4072011-04-26 23:34:58 +0200457
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000458/* The implementation of sys._current_frames() Returns a dict mapping
459 thread id to that thread's current frame.
460*/
Martin v. Löwis4d0d4712010-12-03 20:14:31 +0000461#ifndef Py_LIMITED_API
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000462PyAPI_FUNC(PyObject *) _PyThread_CurrentFrames(void);
Martin v. Löwis4d0d4712010-12-03 20:14:31 +0000463#endif
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000464
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000465/* Routines for advanced debuggers, requested by David Beazley.
466 Don't use unless you know what you are doing! */
Martin v. Löwis4d0d4712010-12-03 20:14:31 +0000467#ifndef Py_LIMITED_API
Eric Snow6b4be192017-05-22 21:36:03 -0700468PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_Main(void);
Mark Hammond91a681d2002-08-12 07:21:58 +0000469PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_Head(void);
470PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_Next(PyInterpreterState *);
471PyAPI_FUNC(PyThreadState *) PyInterpreterState_ThreadHead(PyInterpreterState *);
472PyAPI_FUNC(PyThreadState *) PyThreadState_Next(PyThreadState *);
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000473
Guido van Rossum6297a7a2003-02-19 15:53:17 +0000474typedef struct _frame *(*PyThreadFrameGetter)(PyThreadState *self_);
Martin v. Löwis4d0d4712010-12-03 20:14:31 +0000475#endif
Guido van Rossum6297a7a2003-02-19 15:53:17 +0000476
Guido van Rossuma027efa1997-05-05 20:56:21 +0000477#ifdef __cplusplus
478}
479#endif
480#endif /* !Py_PYSTATE_H */