blob: 8e81707c7cc559d7604df549069963dacfdd4e06 [file] [log] [blame]
Guido van Rossuma027efa1997-05-05 20:56:21 +00001
2/* Thread and interpreter state structures and their interfaces */
3
4#include "Python.h"
5
Victor Stinnerb02ef712016-01-22 14:09:55 +01006#define GET_TSTATE() \
7 ((PyThreadState*)_Py_atomic_load_relaxed(&_PyThreadState_Current))
8#define SET_TSTATE(value) \
Benjamin Petersonca470632016-09-06 13:47:26 -07009 _Py_atomic_store_relaxed(&_PyThreadState_Current, (uintptr_t)(value))
Victor Stinnerb02ef712016-01-22 14:09:55 +010010#define GET_INTERP_STATE() \
11 (GET_TSTATE()->interp)
12
Victor Stinnerbfd316e2016-01-20 11:12:38 +010013
Tim Peters84705582004-10-10 02:47:33 +000014/* --------------------------------------------------------------------------
15CAUTION
16
Victor Stinner1a7425f2013-07-07 16:25:15 +020017Always use PyMem_RawMalloc() and PyMem_RawFree() directly in this file. A
18number of these functions are advertised as safe to call when the GIL isn't
19held, and in a debug build Python redirects (e.g.) PyMem_NEW (etc) to Python's
20debugging obmalloc functions. Those aren't thread-safe (they rely on the GIL
21to avoid the expense of doing their own locking).
Tim Peters84705582004-10-10 02:47:33 +000022-------------------------------------------------------------------------- */
23
Martin v. Löwisf0473d52001-07-18 16:17:16 +000024#ifdef HAVE_DLOPEN
25#ifdef HAVE_DLFCN_H
26#include <dlfcn.h>
27#endif
Serhiy Storchakac2f7d872016-05-04 09:44:44 +030028#if !HAVE_DECL_RTLD_LAZY
Martin v. Löwisf0473d52001-07-18 16:17:16 +000029#define RTLD_LAZY 1
30#endif
31#endif
32
Benjamin Peterson43162b82012-04-13 11:58:27 -040033#ifdef __cplusplus
34extern "C" {
35#endif
Martin v. Löwisf0473d52001-07-18 16:17:16 +000036
Victor Stinner8a1be612016-03-14 22:07:55 +010037int _PyGILState_check_enabled = 1;
38
Guido van Rossum1d5ad901999-06-18 14:22:24 +000039#ifdef WITH_THREAD
40#include "pythread.h"
41static PyThread_type_lock head_mutex = NULL; /* Protects interp->tstate_head */
Moshe Zadka9fb6af92000-08-04 21:27:47 +000042#define HEAD_INIT() (void)(head_mutex || (head_mutex = PyThread_allocate_lock()))
Guido van Rossum1d5ad901999-06-18 14:22:24 +000043#define HEAD_LOCK() PyThread_acquire_lock(head_mutex, WAIT_LOCK)
44#define HEAD_UNLOCK() PyThread_release_lock(head_mutex)
Michael W. Hudson188d4362005-06-20 16:52:57 +000045
46/* The single PyInterpreterState used by this process'
47 GILState implementation
48*/
49static PyInterpreterState *autoInterpreterState = NULL;
Victor Stinner8a1be612016-03-14 22:07:55 +010050static int autoTLSkey = -1;
Guido van Rossum1d5ad901999-06-18 14:22:24 +000051#else
52#define HEAD_INIT() /* Nothing */
53#define HEAD_LOCK() /* Nothing */
54#define HEAD_UNLOCK() /* Nothing */
55#endif
56
Guido van Rossum25ce5661997-08-02 03:10:38 +000057static PyInterpreterState *interp_head = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +000058
Jeffrey Yasskin39370832010-05-03 19:29:34 +000059/* Assuming the current thread holds the GIL, this is the
60 PyThreadState for the current thread. */
Victor Stinnerb02ef712016-01-22 14:09:55 +010061_Py_atomic_address _PyThreadState_Current = {0};
Guido van Rossum6297a7a2003-02-19 15:53:17 +000062PyThreadFrameGetter _PyThreadState_GetFrame = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +000063
Michael W. Hudsonce7da6c2005-09-30 08:20:24 +000064#ifdef WITH_THREAD
Michael W. Hudson188d4362005-06-20 16:52:57 +000065static void _PyGILState_NoteThreadState(PyThreadState* tstate);
Michael W. Hudsonce7da6c2005-09-30 08:20:24 +000066#endif
Michael W. Hudson188d4362005-06-20 16:52:57 +000067
Guido van Rossuma027efa1997-05-05 20:56:21 +000068
69PyInterpreterState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000070PyInterpreterState_New(void)
Guido van Rossuma027efa1997-05-05 20:56:21 +000071{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000072 PyInterpreterState *interp = (PyInterpreterState *)
Victor Stinner1a7425f2013-07-07 16:25:15 +020073 PyMem_RawMalloc(sizeof(PyInterpreterState));
Guido van Rossum25ce5661997-08-02 03:10:38 +000074
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000075 if (interp != NULL) {
76 HEAD_INIT();
Thomas Wouters0e3f5912006-08-11 14:57:12 +000077#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000078 if (head_mutex == NULL)
79 Py_FatalError("Can't initialize threads for interpreter");
Thomas Wouters0e3f5912006-08-11 14:57:12 +000080#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000081 interp->modules = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000082 interp->modules_by_index = NULL;
83 interp->sysdict = NULL;
84 interp->builtins = NULL;
Serhiy Storchaka87a5c512014-02-10 18:21:34 +020085 interp->builtins_copy = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000086 interp->tstate_head = NULL;
87 interp->codec_search_path = NULL;
88 interp->codec_search_cache = NULL;
89 interp->codec_error_registry = NULL;
90 interp->codecs_initialized = 0;
Victor Stinner3cbf14b2011-04-27 00:24:21 +020091 interp->fscodec_initialized = 0;
Brett Cannonfd074152012-04-14 14:10:13 -040092 interp->importlib = NULL;
Serhiy Storchaka133138a2016-08-02 22:51:21 +030093 interp->import_func = NULL;
Brett Cannon3cebf932016-09-05 15:33:46 -070094 interp->eval_frame = _PyEval_EvalFrameDefault;
Martin v. Löwisf0473d52001-07-18 16:17:16 +000095#ifdef HAVE_DLOPEN
Serhiy Storchakac2f7d872016-05-04 09:44:44 +030096#if HAVE_DECL_RTLD_NOW
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000097 interp->dlopenflags = RTLD_NOW;
Martin v. Löwisf0473d52001-07-18 16:17:16 +000098#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000099 interp->dlopenflags = RTLD_LAZY;
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000100#endif
101#endif
Guido van Rossum25ce5661997-08-02 03:10:38 +0000102
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000103 HEAD_LOCK();
104 interp->next = interp_head;
105 interp_head = interp;
106 HEAD_UNLOCK();
107 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000108
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000109 return interp;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000110}
111
112
113void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000114PyInterpreterState_Clear(PyInterpreterState *interp)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000115{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000116 PyThreadState *p;
117 HEAD_LOCK();
118 for (p = interp->tstate_head; p != NULL; p = p->next)
119 PyThreadState_Clear(p);
120 HEAD_UNLOCK();
121 Py_CLEAR(interp->codec_search_path);
122 Py_CLEAR(interp->codec_search_cache);
123 Py_CLEAR(interp->codec_error_registry);
124 Py_CLEAR(interp->modules);
125 Py_CLEAR(interp->modules_by_index);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000126 Py_CLEAR(interp->sysdict);
127 Py_CLEAR(interp->builtins);
Serhiy Storchaka87a5c512014-02-10 18:21:34 +0200128 Py_CLEAR(interp->builtins_copy);
Brett Cannonfd074152012-04-14 14:10:13 -0400129 Py_CLEAR(interp->importlib);
Serhiy Storchaka133138a2016-08-02 22:51:21 +0300130 Py_CLEAR(interp->import_func);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000131}
132
133
134static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000135zapthreads(PyInterpreterState *interp)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000136{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000137 PyThreadState *p;
138 /* No need to lock the mutex here because this should only happen
139 when the threads are all really dead (XXX famous last words). */
140 while ((p = interp->tstate_head) != NULL) {
141 PyThreadState_Delete(p);
142 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000143}
144
145
146void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000147PyInterpreterState_Delete(PyInterpreterState *interp)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000148{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000149 PyInterpreterState **p;
150 zapthreads(interp);
151 HEAD_LOCK();
152 for (p = &interp_head; ; p = &(*p)->next) {
153 if (*p == NULL)
154 Py_FatalError(
155 "PyInterpreterState_Delete: invalid interp");
156 if (*p == interp)
157 break;
158 }
159 if (interp->tstate_head != NULL)
160 Py_FatalError("PyInterpreterState_Delete: remaining threads");
161 *p = interp->next;
162 HEAD_UNLOCK();
Victor Stinner1a7425f2013-07-07 16:25:15 +0200163 PyMem_RawFree(interp);
Antoine Pitrou8db076c2011-10-30 19:13:55 +0100164#ifdef WITH_THREAD
165 if (interp_head == NULL && head_mutex != NULL) {
166 PyThread_free_lock(head_mutex);
167 head_mutex = NULL;
168 }
169#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000170}
171
172
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000173/* Default implementation for _PyThreadState_GetFrame */
174static struct _frame *
175threadstate_getframe(PyThreadState *self)
176{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000177 return self->frame;
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000178}
179
Victor Stinner45b9be52010-03-03 23:28:07 +0000180static PyThreadState *
181new_threadstate(PyInterpreterState *interp, int init)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000182{
Victor Stinner1a7425f2013-07-07 16:25:15 +0200183 PyThreadState *tstate = (PyThreadState *)PyMem_RawMalloc(sizeof(PyThreadState));
Tim Peters84705582004-10-10 02:47:33 +0000184
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000185 if (_PyThreadState_GetFrame == NULL)
186 _PyThreadState_GetFrame = threadstate_getframe;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000187
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000188 if (tstate != NULL) {
189 tstate->interp = interp;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000190
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000191 tstate->frame = NULL;
192 tstate->recursion_depth = 0;
193 tstate->overflowed = 0;
194 tstate->recursion_critical = 0;
195 tstate->tracing = 0;
196 tstate->use_tracing = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000197 tstate->gilstate_counter = 0;
198 tstate->async_exc = NULL;
Martin v. Löwisf9ce67d2003-07-13 10:41:53 +0000199#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000200 tstate->thread_id = PyThread_get_thread_ident();
Martin v. Löwisf9ce67d2003-07-13 10:41:53 +0000201#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000202 tstate->thread_id = 0;
Martin v. Löwisf9ce67d2003-07-13 10:41:53 +0000203#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000204
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000205 tstate->dict = NULL;
Guido van Rossumede04391998-04-10 20:18:25 +0000206
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000207 tstate->curexc_type = NULL;
208 tstate->curexc_value = NULL;
209 tstate->curexc_traceback = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000210
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000211 tstate->exc_type = NULL;
212 tstate->exc_value = NULL;
213 tstate->exc_traceback = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000214
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000215 tstate->c_profilefunc = NULL;
216 tstate->c_tracefunc = NULL;
217 tstate->c_profileobj = NULL;
218 tstate->c_traceobj = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000219
Antoine Pitrou2b0218a2012-09-06 00:59:49 +0200220 tstate->trash_delete_nesting = 0;
221 tstate->trash_delete_later = NULL;
Antoine Pitrou7b476992013-09-07 23:38:37 +0200222 tstate->on_delete = NULL;
223 tstate->on_delete_data = NULL;
Antoine Pitrou2b0218a2012-09-06 00:59:49 +0200224
Yury Selivanov75445082015-05-11 22:57:16 -0400225 tstate->coroutine_wrapper = NULL;
Yury Selivanovaab3c4a2015-06-02 18:43:51 -0400226 tstate->in_coroutine_wrapper = 0;
Brett Cannon5c4de282016-09-07 11:16:41 -0700227 tstate->co_extra_user_count = 0;
Yury Selivanov75445082015-05-11 22:57:16 -0400228
Yury Selivanoveb636452016-09-08 22:01:51 -0700229 tstate->async_gen_firstiter = NULL;
230 tstate->async_gen_finalizer = NULL;
231
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000232 if (init)
233 _PyThreadState_Init(tstate);
Michael W. Hudson188d4362005-06-20 16:52:57 +0000234
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000235 HEAD_LOCK();
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200236 tstate->prev = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000237 tstate->next = interp->tstate_head;
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200238 if (tstate->next)
239 tstate->next->prev = tstate;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000240 interp->tstate_head = tstate;
241 HEAD_UNLOCK();
242 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000243
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000244 return tstate;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000245}
246
Victor Stinner45b9be52010-03-03 23:28:07 +0000247PyThreadState *
248PyThreadState_New(PyInterpreterState *interp)
249{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000250 return new_threadstate(interp, 1);
Victor Stinner45b9be52010-03-03 23:28:07 +0000251}
252
253PyThreadState *
254_PyThreadState_Prealloc(PyInterpreterState *interp)
255{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000256 return new_threadstate(interp, 0);
Victor Stinner45b9be52010-03-03 23:28:07 +0000257}
258
259void
260_PyThreadState_Init(PyThreadState *tstate)
261{
262#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000263 _PyGILState_NoteThreadState(tstate);
Victor Stinner45b9be52010-03-03 23:28:07 +0000264#endif
265}
266
Martin v. Löwis1a214512008-06-11 05:26:20 +0000267PyObject*
Martin v. Löwis7800f752012-06-22 12:20:55 +0200268PyState_FindModule(struct PyModuleDef* module)
Martin v. Löwis1a214512008-06-11 05:26:20 +0000269{
Martin v. Löwis7800f752012-06-22 12:20:55 +0200270 Py_ssize_t index = module->m_base.m_index;
Victor Stinnerb02ef712016-01-22 14:09:55 +0100271 PyInterpreterState *state = GET_INTERP_STATE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000272 PyObject *res;
Nick Coghland5cacbb2015-05-23 22:24:10 +1000273 if (module->m_slots) {
274 return NULL;
275 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000276 if (index == 0)
277 return NULL;
278 if (state->modules_by_index == NULL)
279 return NULL;
Antoine Pitrou75506e82012-08-20 19:30:46 +0200280 if (index >= PyList_GET_SIZE(state->modules_by_index))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000281 return NULL;
282 res = PyList_GET_ITEM(state->modules_by_index, index);
283 return res==Py_None ? NULL : res;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000284}
285
286int
287_PyState_AddModule(PyObject* module, struct PyModuleDef* def)
288{
Nick Coghland5cacbb2015-05-23 22:24:10 +1000289 PyInterpreterState *state;
Berker Peksag4b7b5652016-08-22 18:05:56 +0300290 if (!def) {
291 assert(PyErr_Occurred());
292 return -1;
293 }
Nick Coghland5cacbb2015-05-23 22:24:10 +1000294 if (def->m_slots) {
295 PyErr_SetString(PyExc_SystemError,
296 "PyState_AddModule called on module with slots");
297 return -1;
298 }
Victor Stinnerb02ef712016-01-22 14:09:55 +0100299 state = GET_INTERP_STATE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000300 if (!state->modules_by_index) {
301 state->modules_by_index = PyList_New(0);
302 if (!state->modules_by_index)
303 return -1;
304 }
305 while(PyList_GET_SIZE(state->modules_by_index) <= def->m_base.m_index)
306 if (PyList_Append(state->modules_by_index, Py_None) < 0)
307 return -1;
308 Py_INCREF(module);
309 return PyList_SetItem(state->modules_by_index,
310 def->m_base.m_index, module);
Martin v. Löwis1a214512008-06-11 05:26:20 +0000311}
Guido van Rossuma027efa1997-05-05 20:56:21 +0000312
Martin v. Löwis7800f752012-06-22 12:20:55 +0200313int
314PyState_AddModule(PyObject* module, struct PyModuleDef* def)
315{
316 Py_ssize_t index;
Victor Stinnerb02ef712016-01-22 14:09:55 +0100317 PyInterpreterState *state = GET_INTERP_STATE();
Martin v. Löwis7800f752012-06-22 12:20:55 +0200318 if (!def) {
319 Py_FatalError("PyState_AddModule: Module Definition is NULL");
320 return -1;
321 }
322 index = def->m_base.m_index;
323 if (state->modules_by_index) {
324 if(PyList_GET_SIZE(state->modules_by_index) >= index) {
325 if(module == PyList_GET_ITEM(state->modules_by_index, index)) {
326 Py_FatalError("PyState_AddModule: Module already added!");
327 return -1;
328 }
329 }
330 }
331 return _PyState_AddModule(module, def);
332}
333
334int
335PyState_RemoveModule(struct PyModuleDef* def)
336{
Nick Coghland5cacbb2015-05-23 22:24:10 +1000337 PyInterpreterState *state;
Martin v. Löwis7800f752012-06-22 12:20:55 +0200338 Py_ssize_t index = def->m_base.m_index;
Nick Coghland5cacbb2015-05-23 22:24:10 +1000339 if (def->m_slots) {
340 PyErr_SetString(PyExc_SystemError,
341 "PyState_RemoveModule called on module with slots");
342 return -1;
343 }
Victor Stinnerb02ef712016-01-22 14:09:55 +0100344 state = GET_INTERP_STATE();
Martin v. Löwis7800f752012-06-22 12:20:55 +0200345 if (index == 0) {
346 Py_FatalError("PyState_RemoveModule: Module index invalid.");
347 return -1;
348 }
349 if (state->modules_by_index == NULL) {
350 Py_FatalError("PyState_RemoveModule: Interpreters module-list not acessible.");
351 return -1;
352 }
353 if (index > PyList_GET_SIZE(state->modules_by_index)) {
354 Py_FatalError("PyState_RemoveModule: Module index out of bounds.");
355 return -1;
356 }
357 return PyList_SetItem(state->modules_by_index, index, Py_None);
358}
359
Antoine Pitrou40322e62013-08-11 00:30:09 +0200360/* used by import.c:PyImport_Cleanup */
361void
362_PyState_ClearModules(void)
363{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100364 PyInterpreterState *state = GET_INTERP_STATE();
Antoine Pitrou40322e62013-08-11 00:30:09 +0200365 if (state->modules_by_index) {
366 Py_ssize_t i;
367 for (i = 0; i < PyList_GET_SIZE(state->modules_by_index); i++) {
368 PyObject *m = PyList_GET_ITEM(state->modules_by_index, i);
369 if (PyModule_Check(m)) {
370 /* cleanup the saved copy of module dicts */
371 PyModuleDef *md = PyModule_GetDef(m);
372 if (md)
373 Py_CLEAR(md->m_base.m_copy);
374 }
375 }
376 /* Setting modules_by_index to NULL could be dangerous, so we
377 clear the list instead. */
378 if (PyList_SetSlice(state->modules_by_index,
379 0, PyList_GET_SIZE(state->modules_by_index),
380 NULL))
381 PyErr_WriteUnraisable(state->modules_by_index);
382 }
383}
384
Guido van Rossuma027efa1997-05-05 20:56:21 +0000385void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000386PyThreadState_Clear(PyThreadState *tstate)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000387{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000388 if (Py_VerboseFlag && tstate->frame != NULL)
389 fprintf(stderr,
390 "PyThreadState_Clear: warning: thread still has a frame\n");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000391
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000392 Py_CLEAR(tstate->frame);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000393
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000394 Py_CLEAR(tstate->dict);
395 Py_CLEAR(tstate->async_exc);
Guido van Rossumede04391998-04-10 20:18:25 +0000396
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000397 Py_CLEAR(tstate->curexc_type);
398 Py_CLEAR(tstate->curexc_value);
399 Py_CLEAR(tstate->curexc_traceback);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000400
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000401 Py_CLEAR(tstate->exc_type);
402 Py_CLEAR(tstate->exc_value);
403 Py_CLEAR(tstate->exc_traceback);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000404
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000405 tstate->c_profilefunc = NULL;
406 tstate->c_tracefunc = NULL;
407 Py_CLEAR(tstate->c_profileobj);
408 Py_CLEAR(tstate->c_traceobj);
Yury Selivanov75445082015-05-11 22:57:16 -0400409
410 Py_CLEAR(tstate->coroutine_wrapper);
Yury Selivanoveb636452016-09-08 22:01:51 -0700411 Py_CLEAR(tstate->async_gen_firstiter);
412 Py_CLEAR(tstate->async_gen_finalizer);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000413}
414
415
Guido van Rossum29757862001-01-23 01:46:06 +0000416/* Common code for PyThreadState_Delete() and PyThreadState_DeleteCurrent() */
417static void
418tstate_delete_common(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000419{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000420 PyInterpreterState *interp;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000421 if (tstate == NULL)
422 Py_FatalError("PyThreadState_Delete: NULL tstate");
423 interp = tstate->interp;
424 if (interp == NULL)
425 Py_FatalError("PyThreadState_Delete: NULL interp");
426 HEAD_LOCK();
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200427 if (tstate->prev)
428 tstate->prev->next = tstate->next;
429 else
430 interp->tstate_head = tstate->next;
431 if (tstate->next)
432 tstate->next->prev = tstate->prev;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000433 HEAD_UNLOCK();
Antoine Pitrou7b476992013-09-07 23:38:37 +0200434 if (tstate->on_delete != NULL) {
435 tstate->on_delete(tstate->on_delete_data);
436 }
Victor Stinner1a7425f2013-07-07 16:25:15 +0200437 PyMem_RawFree(tstate);
Guido van Rossuma027efa1997-05-05 20:56:21 +0000438}
439
440
Guido van Rossum29757862001-01-23 01:46:06 +0000441void
442PyThreadState_Delete(PyThreadState *tstate)
443{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100444 if (tstate == GET_TSTATE())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000445 Py_FatalError("PyThreadState_Delete: tstate is still current");
Tim Petersf4e69282006-02-27 17:15:31 +0000446#ifdef WITH_THREAD
Antoine Pitrou079ce542010-09-08 12:37:10 +0000447 if (autoInterpreterState && PyThread_get_key_value(autoTLSkey) == tstate)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000448 PyThread_delete_key_value(autoTLSkey);
Tim Petersf4e69282006-02-27 17:15:31 +0000449#endif /* WITH_THREAD */
Christian Heimesb9dbc7d2013-07-01 23:42:28 +0200450 tstate_delete_common(tstate);
Guido van Rossum29757862001-01-23 01:46:06 +0000451}
452
453
454#ifdef WITH_THREAD
455void
456PyThreadState_DeleteCurrent()
457{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100458 PyThreadState *tstate = GET_TSTATE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000459 if (tstate == NULL)
460 Py_FatalError(
461 "PyThreadState_DeleteCurrent: no current tstate");
Victor Stinner8a1be612016-03-14 22:07:55 +0100462 tstate_delete_common(tstate);
Antoine Pitrou079ce542010-09-08 12:37:10 +0000463 if (autoInterpreterState && PyThread_get_key_value(autoTLSkey) == tstate)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000464 PyThread_delete_key_value(autoTLSkey);
Victor Stinner8a1be612016-03-14 22:07:55 +0100465 SET_TSTATE(NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000466 PyEval_ReleaseLock();
Guido van Rossum29757862001-01-23 01:46:06 +0000467}
468#endif /* WITH_THREAD */
469
470
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200471/*
472 * Delete all thread states except the one passed as argument.
473 * Note that, if there is a current thread state, it *must* be the one
474 * passed as argument. Also, this won't touch any other interpreters
475 * than the current one, since we don't know which thread state should
476 * be kept in those other interpreteres.
477 */
478void
479_PyThreadState_DeleteExcept(PyThreadState *tstate)
480{
481 PyInterpreterState *interp = tstate->interp;
482 PyThreadState *p, *next, *garbage;
483 HEAD_LOCK();
484 /* Remove all thread states, except tstate, from the linked list of
485 thread states. This will allow calling PyThreadState_Clear()
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200486 without holding the lock. */
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200487 garbage = interp->tstate_head;
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200488 if (garbage == tstate)
489 garbage = tstate->next;
490 if (tstate->prev)
491 tstate->prev->next = tstate->next;
492 if (tstate->next)
493 tstate->next->prev = tstate->prev;
494 tstate->prev = tstate->next = NULL;
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200495 interp->tstate_head = tstate;
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200496 HEAD_UNLOCK();
497 /* Clear and deallocate all stale thread states. Even if this
498 executes Python code, we should be safe since it executes
499 in the current thread, not one of the stale threads. */
500 for (p = garbage; p; p = next) {
501 next = p->next;
502 PyThreadState_Clear(p);
Victor Stinner1a7425f2013-07-07 16:25:15 +0200503 PyMem_RawFree(p);
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200504 }
505}
506
507
Guido van Rossuma027efa1997-05-05 20:56:21 +0000508PyThreadState *
Victor Stinnerbfd316e2016-01-20 11:12:38 +0100509_PyThreadState_UncheckedGet(void)
510{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100511 return GET_TSTATE();
Victor Stinnerbfd316e2016-01-20 11:12:38 +0100512}
513
514
515PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000516PyThreadState_Get(void)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000517{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100518 PyThreadState *tstate = GET_TSTATE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000519 if (tstate == NULL)
520 Py_FatalError("PyThreadState_Get: no current thread");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000521
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000522 return tstate;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000523}
524
525
526PyThreadState *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000527PyThreadState_Swap(PyThreadState *newts)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000528{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100529 PyThreadState *oldts = GET_TSTATE();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000530
Victor Stinnerb02ef712016-01-22 14:09:55 +0100531 SET_TSTATE(newts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000532 /* It should not be possible for more than one thread state
533 to be used for a thread. Check this the best we can in debug
534 builds.
535 */
Martin v. Löwis9e296252003-05-01 05:25:29 +0000536#if defined(Py_DEBUG) && defined(WITH_THREAD)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000537 if (newts) {
538 /* This can be called from PyEval_RestoreThread(). Similar
539 to it, we need to ensure errno doesn't change.
540 */
541 int err = errno;
542 PyThreadState *check = PyGILState_GetThisThreadState();
543 if (check && check->interp == newts->interp && check != newts)
544 Py_FatalError("Invalid thread state for this thread");
545 errno = err;
546 }
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000547#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000548 return oldts;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000549}
Guido van Rossumede04391998-04-10 20:18:25 +0000550
551/* An extension mechanism to store arbitrary additional per-thread state.
552 PyThreadState_GetDict() returns a dictionary that can be used to hold such
553 state; the caller should pick a unique key and store its state there. If
Guido van Rossum0fc8f002003-04-15 15:12:39 +0000554 PyThreadState_GetDict() returns NULL, an exception has *not* been raised
555 and the caller should assume no per-thread state is available. */
Guido van Rossumede04391998-04-10 20:18:25 +0000556
557PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000558PyThreadState_GetDict(void)
Guido van Rossumede04391998-04-10 20:18:25 +0000559{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100560 PyThreadState *tstate = GET_TSTATE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000561 if (tstate == NULL)
562 return NULL;
Guido van Rossumede04391998-04-10 20:18:25 +0000563
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000564 if (tstate->dict == NULL) {
565 PyObject *d;
566 tstate->dict = d = PyDict_New();
567 if (d == NULL)
568 PyErr_Clear();
569 }
570 return tstate->dict;
Guido van Rossumede04391998-04-10 20:18:25 +0000571}
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000572
573
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000574/* Asynchronously raise an exception in a thread.
575 Requested by Just van Rossum and Alex Martelli.
Guido van Rossum0f1f63c2005-02-08 02:07:57 +0000576 To prevent naive misuse, you must write your own extension
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000577 to call this, or use ctypes. Must be called with the GIL held.
578 Returns the number of tstates modified (normally 1, but 0 if `id` didn't
579 match any known thread id). Can be called with exc=NULL to clear an
580 existing async exception. This raises no exceptions. */
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000581
582int
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200583PyThreadState_SetAsyncExc(unsigned long id, PyObject *exc)
584{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100585 PyInterpreterState *interp = GET_INTERP_STATE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000586 PyThreadState *p;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000587
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000588 /* Although the GIL is held, a few C API functions can be called
589 * without the GIL held, and in particular some that create and
590 * destroy thread and interpreter states. Those can mutate the
591 * list of thread states we're traversing, so to prevent that we lock
592 * head_mutex for the duration.
593 */
594 HEAD_LOCK();
595 for (p = interp->tstate_head; p != NULL; p = p->next) {
596 if (p->thread_id == id) {
597 /* Tricky: we need to decref the current value
598 * (if any) in p->async_exc, but that can in turn
599 * allow arbitrary Python code to run, including
600 * perhaps calls to this function. To prevent
601 * deadlock, we need to release head_mutex before
602 * the decref.
603 */
604 PyObject *old_exc = p->async_exc;
605 Py_XINCREF(exc);
606 p->async_exc = exc;
607 HEAD_UNLOCK();
608 Py_XDECREF(old_exc);
609 _PyEval_SignalAsyncExc();
610 return 1;
611 }
612 }
613 HEAD_UNLOCK();
614 return 0;
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000615}
616
617
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000618/* Routines for advanced debuggers, requested by David Beazley.
619 Don't use unless you know what you are doing! */
620
621PyInterpreterState *
622PyInterpreterState_Head(void)
623{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000624 return interp_head;
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000625}
626
627PyInterpreterState *
628PyInterpreterState_Next(PyInterpreterState *interp) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000629 return interp->next;
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000630}
631
632PyThreadState *
633PyInterpreterState_ThreadHead(PyInterpreterState *interp) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000634 return interp->tstate_head;
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000635}
636
637PyThreadState *
638PyThreadState_Next(PyThreadState *tstate) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000639 return tstate->next;
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000640}
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000641
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000642/* The implementation of sys._current_frames(). This is intended to be
643 called with the GIL held, as it will be when called via
644 sys._current_frames(). It's possible it would work fine even without
645 the GIL held, but haven't thought enough about that.
646*/
647PyObject *
648_PyThread_CurrentFrames(void)
649{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000650 PyObject *result;
651 PyInterpreterState *i;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000652
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000653 result = PyDict_New();
654 if (result == NULL)
655 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000656
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000657 /* for i in all interpreters:
658 * for t in all of i's thread states:
659 * if t's frame isn't NULL, map t's id to its frame
Ezio Melotti13925002011-03-16 11:05:33 +0200660 * Because these lists can mutate even when the GIL is held, we
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000661 * need to grab head_mutex for the duration.
662 */
663 HEAD_LOCK();
664 for (i = interp_head; i != NULL; i = i->next) {
665 PyThreadState *t;
666 for (t = i->tstate_head; t != NULL; t = t->next) {
667 PyObject *id;
668 int stat;
669 struct _frame *frame = t->frame;
670 if (frame == NULL)
671 continue;
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200672 id = PyLong_FromUnsignedLong(t->thread_id);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000673 if (id == NULL)
674 goto Fail;
675 stat = PyDict_SetItem(result, id, (PyObject *)frame);
676 Py_DECREF(id);
677 if (stat < 0)
678 goto Fail;
679 }
680 }
681 HEAD_UNLOCK();
682 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000683
684 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000685 HEAD_UNLOCK();
686 Py_DECREF(result);
687 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000688}
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000689
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000690/* Python "auto thread state" API. */
691#ifdef WITH_THREAD
692
693/* Keep this as a static, as it is not reliable! It can only
694 ever be compared to the state for the *current* thread.
695 * If not equal, then it doesn't matter that the actual
696 value may change immediately after comparison, as it can't
697 possibly change to the current thread's state.
698 * If equal, then the current thread holds the lock, so the value can't
699 change until we yield the lock.
700*/
701static int
702PyThreadState_IsCurrent(PyThreadState *tstate)
703{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000704 /* Must be the tstate for this thread */
705 assert(PyGILState_GetThisThreadState()==tstate);
Victor Stinnerb02ef712016-01-22 14:09:55 +0100706 return tstate == GET_TSTATE();
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000707}
708
Tim Peters4c1f5ec2004-10-09 17:25:05 +0000709/* Internal initialization/finalization functions called by
Martin Panterb4ce1fc2015-11-30 03:18:29 +0000710 Py_Initialize/Py_FinalizeEx
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000711*/
Tim Peters19717fa2004-10-09 17:38:29 +0000712void
713_PyGILState_Init(PyInterpreterState *i, PyThreadState *t)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000714{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000715 assert(i && t); /* must init with valid states */
716 autoTLSkey = PyThread_create_key();
Kristján Valur Jónsson2fea9b92010-09-20 02:11:49 +0000717 if (autoTLSkey == -1)
718 Py_FatalError("Could not allocate TLS entry");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000719 autoInterpreterState = i;
720 assert(PyThread_get_key_value(autoTLSkey) == NULL);
721 assert(t->gilstate_counter == 0);
Michael W. Hudson188d4362005-06-20 16:52:57 +0000722
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000723 _PyGILState_NoteThreadState(t);
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000724}
725
Victor Stinner861d9ab2016-03-16 22:45:24 +0100726PyInterpreterState *
727_PyGILState_GetInterpreterStateUnsafe(void)
728{
729 return autoInterpreterState;
730}
731
Tim Peters19717fa2004-10-09 17:38:29 +0000732void
733_PyGILState_Fini(void)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000734{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000735 PyThread_delete_key(autoTLSkey);
Victor Stinner8a1be612016-03-14 22:07:55 +0100736 autoTLSkey = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000737 autoInterpreterState = NULL;
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000738}
739
Charles-François Natalia233df82011-11-22 19:49:51 +0100740/* Reset the TLS key - called by PyOS_AfterFork().
Antoine Pitrou0c759fe2011-04-27 19:28:05 +0200741 * This should not be necessary, but some - buggy - pthread implementations
Charles-François Natalia233df82011-11-22 19:49:51 +0100742 * don't reset TLS upon fork(), see issue #10517.
Antoine Pitrou0c759fe2011-04-27 19:28:05 +0200743 */
744void
745_PyGILState_Reinit(void)
746{
747 PyThreadState *tstate = PyGILState_GetThisThreadState();
748 PyThread_delete_key(autoTLSkey);
749 if ((autoTLSkey = PyThread_create_key()) == -1)
750 Py_FatalError("Could not allocate TLS entry");
751
Charles-François Natalia233df82011-11-22 19:49:51 +0100752 /* If the thread had an associated auto thread state, reassociate it with
753 * the new key. */
754 if (tstate && PyThread_set_key_value(autoTLSkey, (void *)tstate) < 0)
Antoine Pitrou0c759fe2011-04-27 19:28:05 +0200755 Py_FatalError("Couldn't create autoTLSkey mapping");
756}
757
Michael W. Hudson188d4362005-06-20 16:52:57 +0000758/* When a thread state is created for a thread by some mechanism other than
759 PyGILState_Ensure, it's important that the GILState machinery knows about
760 it so it doesn't try to create another thread state for the thread (this is
761 a better fix for SF bug #1010677 than the first one attempted).
762*/
Thomas Wouters89f507f2006-12-13 04:49:30 +0000763static void
Michael W. Hudson188d4362005-06-20 16:52:57 +0000764_PyGILState_NoteThreadState(PyThreadState* tstate)
765{
Antoine Pitrou079ce542010-09-08 12:37:10 +0000766 /* If autoTLSkey isn't initialized, this must be the very first
767 threadstate created in Py_Initialize(). Don't do anything for now
768 (we'll be back here when _PyGILState_Init is called). */
769 if (!autoInterpreterState)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000770 return;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000771
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000772 /* Stick the thread state for this thread in thread local storage.
Michael W. Hudson188d4362005-06-20 16:52:57 +0000773
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000774 The only situation where you can legitimately have more than one
775 thread state for an OS level thread is when there are multiple
Victor Stinner590cebe2013-12-13 11:08:56 +0100776 interpreters.
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000777
Victor Stinner590cebe2013-12-13 11:08:56 +0100778 You shouldn't really be using the PyGILState_ APIs anyway (see issues
779 #10915 and #15751).
Michael W. Hudson188d4362005-06-20 16:52:57 +0000780
Victor Stinner590cebe2013-12-13 11:08:56 +0100781 The first thread state created for that given OS level thread will
782 "win", which seems reasonable behaviour.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000783 */
Victor Stinner590cebe2013-12-13 11:08:56 +0100784 if (PyThread_get_key_value(autoTLSkey) == NULL) {
785 if (PyThread_set_key_value(autoTLSkey, (void *)tstate) < 0)
786 Py_FatalError("Couldn't create autoTLSkey mapping");
787 }
Michael W. Hudson188d4362005-06-20 16:52:57 +0000788
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000789 /* PyGILState_Release must not try to delete this thread state. */
790 tstate->gilstate_counter = 1;
Michael W. Hudson188d4362005-06-20 16:52:57 +0000791}
792
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000793/* The public functions */
Tim Peters19717fa2004-10-09 17:38:29 +0000794PyThreadState *
795PyGILState_GetThisThreadState(void)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000796{
Antoine Pitrou079ce542010-09-08 12:37:10 +0000797 if (autoInterpreterState == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000798 return NULL;
799 return (PyThreadState *)PyThread_get_key_value(autoTLSkey);
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000800}
801
Kristján Valur Jónsson684cd0e2013-03-23 03:36:16 -0700802int
803PyGILState_Check(void)
804{
Victor Stinner8a1be612016-03-14 22:07:55 +0100805 PyThreadState *tstate;
806
807 if (!_PyGILState_check_enabled)
808 return 1;
809
810 if (autoTLSkey == -1)
811 return 1;
812
813 tstate = GET_TSTATE();
814 if (tstate == NULL)
815 return 0;
816
817 return (tstate == PyGILState_GetThisThreadState());
Kristján Valur Jónsson684cd0e2013-03-23 03:36:16 -0700818}
819
Tim Peters19717fa2004-10-09 17:38:29 +0000820PyGILState_STATE
821PyGILState_Ensure(void)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000822{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000823 int current;
824 PyThreadState *tcur;
825 /* Note that we do not auto-init Python here - apart from
826 potential races with 2 threads auto-initializing, pep-311
827 spells out other issues. Embedders are expected to have
828 called Py_Initialize() and usually PyEval_InitThreads().
829 */
830 assert(autoInterpreterState); /* Py_Initialize() hasn't been called! */
831 tcur = (PyThreadState *)PyThread_get_key_value(autoTLSkey);
832 if (tcur == NULL) {
Victor Stinner62ca1002013-12-13 01:46:43 +0100833 /* At startup, Python has no concrete GIL. If PyGILState_Ensure() is
834 called from a new thread for the first time, we need the create the
835 GIL. */
836 PyEval_InitThreads();
837
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000838 /* Create a new thread state for this thread */
839 tcur = PyThreadState_New(autoInterpreterState);
840 if (tcur == NULL)
841 Py_FatalError("Couldn't create thread-state for new thread");
842 /* This is our thread state! We'll need to delete it in the
843 matching call to PyGILState_Release(). */
844 tcur->gilstate_counter = 0;
845 current = 0; /* new thread state is never current */
846 }
847 else
848 current = PyThreadState_IsCurrent(tcur);
849 if (current == 0)
850 PyEval_RestoreThread(tcur);
851 /* Update our counter in the thread-state - no need for locks:
852 - tcur will remain valid as we hold the GIL.
853 - the counter is safe as we are the only thread "allowed"
854 to modify this value
855 */
856 ++tcur->gilstate_counter;
857 return current ? PyGILState_LOCKED : PyGILState_UNLOCKED;
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000858}
859
Tim Peters19717fa2004-10-09 17:38:29 +0000860void
861PyGILState_Release(PyGILState_STATE oldstate)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000862{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000863 PyThreadState *tcur = (PyThreadState *)PyThread_get_key_value(
864 autoTLSkey);
865 if (tcur == NULL)
866 Py_FatalError("auto-releasing thread-state, "
867 "but no thread-state for this thread");
868 /* We must hold the GIL and have our thread state current */
869 /* XXX - remove the check - the assert should be fine,
870 but while this is very new (April 2003), the extra check
871 by release-only users can't hurt.
872 */
873 if (! PyThreadState_IsCurrent(tcur))
874 Py_FatalError("This thread state must be current when releasing");
875 assert(PyThreadState_IsCurrent(tcur));
876 --tcur->gilstate_counter;
877 assert(tcur->gilstate_counter >= 0); /* illegal counter value */
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000878
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000879 /* If we're going to destroy this thread-state, we must
880 * clear it while the GIL is held, as destructors may run.
881 */
882 if (tcur->gilstate_counter == 0) {
883 /* can't have been locked when we created it */
884 assert(oldstate == PyGILState_UNLOCKED);
885 PyThreadState_Clear(tcur);
886 /* Delete the thread-state. Note this releases the GIL too!
887 * It's vital that the GIL be held here, to avoid shutdown
888 * races; see bugs 225673 and 1061968 (that nasty bug has a
889 * habit of coming back).
890 */
891 PyThreadState_DeleteCurrent();
892 }
893 /* Release the lock if necessary */
894 else if (oldstate == PyGILState_UNLOCKED)
895 PyEval_SaveThread();
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000896}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000897
Benjamin Peterson3bf01752012-04-13 18:06:36 -0400898#endif /* WITH_THREAD */
899
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000900#ifdef __cplusplus
901}
902#endif
903
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000904