blob: a0a8c97008aee7f49c0aebaf782a8dd1d6db1c0c [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
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000102#ifdef WITH_TSC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000103 interp->tscdump = 0;
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000104#endif
Guido van Rossum25ce5661997-08-02 03:10:38 +0000105
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000106 HEAD_LOCK();
107 interp->next = interp_head;
108 interp_head = interp;
109 HEAD_UNLOCK();
110 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000111
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000112 return interp;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000113}
114
115
116void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000117PyInterpreterState_Clear(PyInterpreterState *interp)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000118{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000119 PyThreadState *p;
120 HEAD_LOCK();
121 for (p = interp->tstate_head; p != NULL; p = p->next)
122 PyThreadState_Clear(p);
123 HEAD_UNLOCK();
124 Py_CLEAR(interp->codec_search_path);
125 Py_CLEAR(interp->codec_search_cache);
126 Py_CLEAR(interp->codec_error_registry);
127 Py_CLEAR(interp->modules);
128 Py_CLEAR(interp->modules_by_index);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000129 Py_CLEAR(interp->sysdict);
130 Py_CLEAR(interp->builtins);
Serhiy Storchaka87a5c512014-02-10 18:21:34 +0200131 Py_CLEAR(interp->builtins_copy);
Brett Cannonfd074152012-04-14 14:10:13 -0400132 Py_CLEAR(interp->importlib);
Serhiy Storchaka133138a2016-08-02 22:51:21 +0300133 Py_CLEAR(interp->import_func);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000134}
135
136
137static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000138zapthreads(PyInterpreterState *interp)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000139{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000140 PyThreadState *p;
141 /* No need to lock the mutex here because this should only happen
142 when the threads are all really dead (XXX famous last words). */
143 while ((p = interp->tstate_head) != NULL) {
144 PyThreadState_Delete(p);
145 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000146}
147
148
149void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000150PyInterpreterState_Delete(PyInterpreterState *interp)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000151{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000152 PyInterpreterState **p;
153 zapthreads(interp);
154 HEAD_LOCK();
155 for (p = &interp_head; ; p = &(*p)->next) {
156 if (*p == NULL)
157 Py_FatalError(
158 "PyInterpreterState_Delete: invalid interp");
159 if (*p == interp)
160 break;
161 }
162 if (interp->tstate_head != NULL)
163 Py_FatalError("PyInterpreterState_Delete: remaining threads");
164 *p = interp->next;
165 HEAD_UNLOCK();
Victor Stinner1a7425f2013-07-07 16:25:15 +0200166 PyMem_RawFree(interp);
Antoine Pitrou8db076c2011-10-30 19:13:55 +0100167#ifdef WITH_THREAD
168 if (interp_head == NULL && head_mutex != NULL) {
169 PyThread_free_lock(head_mutex);
170 head_mutex = NULL;
171 }
172#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000173}
174
175
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000176/* Default implementation for _PyThreadState_GetFrame */
177static struct _frame *
178threadstate_getframe(PyThreadState *self)
179{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000180 return self->frame;
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000181}
182
Victor Stinner45b9be52010-03-03 23:28:07 +0000183static PyThreadState *
184new_threadstate(PyInterpreterState *interp, int init)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000185{
Victor Stinner1a7425f2013-07-07 16:25:15 +0200186 PyThreadState *tstate = (PyThreadState *)PyMem_RawMalloc(sizeof(PyThreadState));
Tim Peters84705582004-10-10 02:47:33 +0000187
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000188 if (_PyThreadState_GetFrame == NULL)
189 _PyThreadState_GetFrame = threadstate_getframe;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000190
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000191 if (tstate != NULL) {
192 tstate->interp = interp;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000193
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000194 tstate->frame = NULL;
195 tstate->recursion_depth = 0;
196 tstate->overflowed = 0;
197 tstate->recursion_critical = 0;
198 tstate->tracing = 0;
199 tstate->use_tracing = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000200 tstate->gilstate_counter = 0;
201 tstate->async_exc = NULL;
Martin v. Löwisf9ce67d2003-07-13 10:41:53 +0000202#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000203 tstate->thread_id = PyThread_get_thread_ident();
Martin v. Löwisf9ce67d2003-07-13 10:41:53 +0000204#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000205 tstate->thread_id = 0;
Martin v. Löwisf9ce67d2003-07-13 10:41:53 +0000206#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000207
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000208 tstate->dict = NULL;
Guido van Rossumede04391998-04-10 20:18:25 +0000209
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000210 tstate->curexc_type = NULL;
211 tstate->curexc_value = NULL;
212 tstate->curexc_traceback = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000213
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000214 tstate->exc_type = NULL;
215 tstate->exc_value = NULL;
216 tstate->exc_traceback = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000217
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000218 tstate->c_profilefunc = NULL;
219 tstate->c_tracefunc = NULL;
220 tstate->c_profileobj = NULL;
221 tstate->c_traceobj = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000222
Antoine Pitrou2b0218a2012-09-06 00:59:49 +0200223 tstate->trash_delete_nesting = 0;
224 tstate->trash_delete_later = NULL;
Antoine Pitrou7b476992013-09-07 23:38:37 +0200225 tstate->on_delete = NULL;
226 tstate->on_delete_data = NULL;
Antoine Pitrou2b0218a2012-09-06 00:59:49 +0200227
Yury Selivanov75445082015-05-11 22:57:16 -0400228 tstate->coroutine_wrapper = NULL;
Yury Selivanovaab3c4a2015-06-02 18:43:51 -0400229 tstate->in_coroutine_wrapper = 0;
Brett Cannon5c4de282016-09-07 11:16:41 -0700230 tstate->co_extra_user_count = 0;
Yury Selivanov75445082015-05-11 22:57:16 -0400231
Yury Selivanoveb636452016-09-08 22:01:51 -0700232 tstate->async_gen_firstiter = NULL;
233 tstate->async_gen_finalizer = NULL;
234
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000235 if (init)
236 _PyThreadState_Init(tstate);
Michael W. Hudson188d4362005-06-20 16:52:57 +0000237
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000238 HEAD_LOCK();
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200239 tstate->prev = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000240 tstate->next = interp->tstate_head;
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200241 if (tstate->next)
242 tstate->next->prev = tstate;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000243 interp->tstate_head = tstate;
244 HEAD_UNLOCK();
245 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000246
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000247 return tstate;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000248}
249
Victor Stinner45b9be52010-03-03 23:28:07 +0000250PyThreadState *
251PyThreadState_New(PyInterpreterState *interp)
252{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000253 return new_threadstate(interp, 1);
Victor Stinner45b9be52010-03-03 23:28:07 +0000254}
255
256PyThreadState *
257_PyThreadState_Prealloc(PyInterpreterState *interp)
258{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000259 return new_threadstate(interp, 0);
Victor Stinner45b9be52010-03-03 23:28:07 +0000260}
261
262void
263_PyThreadState_Init(PyThreadState *tstate)
264{
265#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000266 _PyGILState_NoteThreadState(tstate);
Victor Stinner45b9be52010-03-03 23:28:07 +0000267#endif
268}
269
Martin v. Löwis1a214512008-06-11 05:26:20 +0000270PyObject*
Martin v. Löwis7800f752012-06-22 12:20:55 +0200271PyState_FindModule(struct PyModuleDef* module)
Martin v. Löwis1a214512008-06-11 05:26:20 +0000272{
Martin v. Löwis7800f752012-06-22 12:20:55 +0200273 Py_ssize_t index = module->m_base.m_index;
Victor Stinnerb02ef712016-01-22 14:09:55 +0100274 PyInterpreterState *state = GET_INTERP_STATE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000275 PyObject *res;
Nick Coghland5cacbb2015-05-23 22:24:10 +1000276 if (module->m_slots) {
277 return NULL;
278 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000279 if (index == 0)
280 return NULL;
281 if (state->modules_by_index == NULL)
282 return NULL;
Antoine Pitrou75506e82012-08-20 19:30:46 +0200283 if (index >= PyList_GET_SIZE(state->modules_by_index))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000284 return NULL;
285 res = PyList_GET_ITEM(state->modules_by_index, index);
286 return res==Py_None ? NULL : res;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000287}
288
289int
290_PyState_AddModule(PyObject* module, struct PyModuleDef* def)
291{
Nick Coghland5cacbb2015-05-23 22:24:10 +1000292 PyInterpreterState *state;
Berker Peksag4b7b5652016-08-22 18:05:56 +0300293 if (!def) {
294 assert(PyErr_Occurred());
295 return -1;
296 }
Nick Coghland5cacbb2015-05-23 22:24:10 +1000297 if (def->m_slots) {
298 PyErr_SetString(PyExc_SystemError,
299 "PyState_AddModule called on module with slots");
300 return -1;
301 }
Victor Stinnerb02ef712016-01-22 14:09:55 +0100302 state = GET_INTERP_STATE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000303 if (!state->modules_by_index) {
304 state->modules_by_index = PyList_New(0);
305 if (!state->modules_by_index)
306 return -1;
307 }
308 while(PyList_GET_SIZE(state->modules_by_index) <= def->m_base.m_index)
309 if (PyList_Append(state->modules_by_index, Py_None) < 0)
310 return -1;
311 Py_INCREF(module);
312 return PyList_SetItem(state->modules_by_index,
313 def->m_base.m_index, module);
Martin v. Löwis1a214512008-06-11 05:26:20 +0000314}
Guido van Rossuma027efa1997-05-05 20:56:21 +0000315
Martin v. Löwis7800f752012-06-22 12:20:55 +0200316int
317PyState_AddModule(PyObject* module, struct PyModuleDef* def)
318{
319 Py_ssize_t index;
Victor Stinnerb02ef712016-01-22 14:09:55 +0100320 PyInterpreterState *state = GET_INTERP_STATE();
Martin v. Löwis7800f752012-06-22 12:20:55 +0200321 if (!def) {
322 Py_FatalError("PyState_AddModule: Module Definition is NULL");
323 return -1;
324 }
325 index = def->m_base.m_index;
326 if (state->modules_by_index) {
327 if(PyList_GET_SIZE(state->modules_by_index) >= index) {
328 if(module == PyList_GET_ITEM(state->modules_by_index, index)) {
329 Py_FatalError("PyState_AddModule: Module already added!");
330 return -1;
331 }
332 }
333 }
334 return _PyState_AddModule(module, def);
335}
336
337int
338PyState_RemoveModule(struct PyModuleDef* def)
339{
Nick Coghland5cacbb2015-05-23 22:24:10 +1000340 PyInterpreterState *state;
Martin v. Löwis7800f752012-06-22 12:20:55 +0200341 Py_ssize_t index = def->m_base.m_index;
Nick Coghland5cacbb2015-05-23 22:24:10 +1000342 if (def->m_slots) {
343 PyErr_SetString(PyExc_SystemError,
344 "PyState_RemoveModule called on module with slots");
345 return -1;
346 }
Victor Stinnerb02ef712016-01-22 14:09:55 +0100347 state = GET_INTERP_STATE();
Martin v. Löwis7800f752012-06-22 12:20:55 +0200348 if (index == 0) {
349 Py_FatalError("PyState_RemoveModule: Module index invalid.");
350 return -1;
351 }
352 if (state->modules_by_index == NULL) {
353 Py_FatalError("PyState_RemoveModule: Interpreters module-list not acessible.");
354 return -1;
355 }
356 if (index > PyList_GET_SIZE(state->modules_by_index)) {
357 Py_FatalError("PyState_RemoveModule: Module index out of bounds.");
358 return -1;
359 }
360 return PyList_SetItem(state->modules_by_index, index, Py_None);
361}
362
Antoine Pitrou40322e62013-08-11 00:30:09 +0200363/* used by import.c:PyImport_Cleanup */
364void
365_PyState_ClearModules(void)
366{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100367 PyInterpreterState *state = GET_INTERP_STATE();
Antoine Pitrou40322e62013-08-11 00:30:09 +0200368 if (state->modules_by_index) {
369 Py_ssize_t i;
370 for (i = 0; i < PyList_GET_SIZE(state->modules_by_index); i++) {
371 PyObject *m = PyList_GET_ITEM(state->modules_by_index, i);
372 if (PyModule_Check(m)) {
373 /* cleanup the saved copy of module dicts */
374 PyModuleDef *md = PyModule_GetDef(m);
375 if (md)
376 Py_CLEAR(md->m_base.m_copy);
377 }
378 }
379 /* Setting modules_by_index to NULL could be dangerous, so we
380 clear the list instead. */
381 if (PyList_SetSlice(state->modules_by_index,
382 0, PyList_GET_SIZE(state->modules_by_index),
383 NULL))
384 PyErr_WriteUnraisable(state->modules_by_index);
385 }
386}
387
Guido van Rossuma027efa1997-05-05 20:56:21 +0000388void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000389PyThreadState_Clear(PyThreadState *tstate)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000390{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000391 if (Py_VerboseFlag && tstate->frame != NULL)
392 fprintf(stderr,
393 "PyThreadState_Clear: warning: thread still has a frame\n");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000394
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000395 Py_CLEAR(tstate->frame);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000396
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000397 Py_CLEAR(tstate->dict);
398 Py_CLEAR(tstate->async_exc);
Guido van Rossumede04391998-04-10 20:18:25 +0000399
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000400 Py_CLEAR(tstate->curexc_type);
401 Py_CLEAR(tstate->curexc_value);
402 Py_CLEAR(tstate->curexc_traceback);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000403
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000404 Py_CLEAR(tstate->exc_type);
405 Py_CLEAR(tstate->exc_value);
406 Py_CLEAR(tstate->exc_traceback);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000407
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000408 tstate->c_profilefunc = NULL;
409 tstate->c_tracefunc = NULL;
410 Py_CLEAR(tstate->c_profileobj);
411 Py_CLEAR(tstate->c_traceobj);
Yury Selivanov75445082015-05-11 22:57:16 -0400412
413 Py_CLEAR(tstate->coroutine_wrapper);
Yury Selivanoveb636452016-09-08 22:01:51 -0700414 Py_CLEAR(tstate->async_gen_firstiter);
415 Py_CLEAR(tstate->async_gen_finalizer);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000416}
417
418
Guido van Rossum29757862001-01-23 01:46:06 +0000419/* Common code for PyThreadState_Delete() and PyThreadState_DeleteCurrent() */
420static void
421tstate_delete_common(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000422{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000423 PyInterpreterState *interp;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000424 if (tstate == NULL)
425 Py_FatalError("PyThreadState_Delete: NULL tstate");
426 interp = tstate->interp;
427 if (interp == NULL)
428 Py_FatalError("PyThreadState_Delete: NULL interp");
429 HEAD_LOCK();
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200430 if (tstate->prev)
431 tstate->prev->next = tstate->next;
432 else
433 interp->tstate_head = tstate->next;
434 if (tstate->next)
435 tstate->next->prev = tstate->prev;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000436 HEAD_UNLOCK();
Antoine Pitrou7b476992013-09-07 23:38:37 +0200437 if (tstate->on_delete != NULL) {
438 tstate->on_delete(tstate->on_delete_data);
439 }
Victor Stinner1a7425f2013-07-07 16:25:15 +0200440 PyMem_RawFree(tstate);
Guido van Rossuma027efa1997-05-05 20:56:21 +0000441}
442
443
Guido van Rossum29757862001-01-23 01:46:06 +0000444void
445PyThreadState_Delete(PyThreadState *tstate)
446{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100447 if (tstate == GET_TSTATE())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000448 Py_FatalError("PyThreadState_Delete: tstate is still current");
Tim Petersf4e69282006-02-27 17:15:31 +0000449#ifdef WITH_THREAD
Antoine Pitrou079ce542010-09-08 12:37:10 +0000450 if (autoInterpreterState && PyThread_get_key_value(autoTLSkey) == tstate)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000451 PyThread_delete_key_value(autoTLSkey);
Tim Petersf4e69282006-02-27 17:15:31 +0000452#endif /* WITH_THREAD */
Christian Heimesb9dbc7d2013-07-01 23:42:28 +0200453 tstate_delete_common(tstate);
Guido van Rossum29757862001-01-23 01:46:06 +0000454}
455
456
457#ifdef WITH_THREAD
458void
459PyThreadState_DeleteCurrent()
460{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100461 PyThreadState *tstate = GET_TSTATE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000462 if (tstate == NULL)
463 Py_FatalError(
464 "PyThreadState_DeleteCurrent: no current tstate");
Victor Stinner8a1be612016-03-14 22:07:55 +0100465 tstate_delete_common(tstate);
Antoine Pitrou079ce542010-09-08 12:37:10 +0000466 if (autoInterpreterState && PyThread_get_key_value(autoTLSkey) == tstate)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000467 PyThread_delete_key_value(autoTLSkey);
Victor Stinner8a1be612016-03-14 22:07:55 +0100468 SET_TSTATE(NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000469 PyEval_ReleaseLock();
Guido van Rossum29757862001-01-23 01:46:06 +0000470}
471#endif /* WITH_THREAD */
472
473
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200474/*
475 * Delete all thread states except the one passed as argument.
476 * Note that, if there is a current thread state, it *must* be the one
477 * passed as argument. Also, this won't touch any other interpreters
478 * than the current one, since we don't know which thread state should
479 * be kept in those other interpreteres.
480 */
481void
482_PyThreadState_DeleteExcept(PyThreadState *tstate)
483{
484 PyInterpreterState *interp = tstate->interp;
485 PyThreadState *p, *next, *garbage;
486 HEAD_LOCK();
487 /* Remove all thread states, except tstate, from the linked list of
488 thread states. This will allow calling PyThreadState_Clear()
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200489 without holding the lock. */
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200490 garbage = interp->tstate_head;
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200491 if (garbage == tstate)
492 garbage = tstate->next;
493 if (tstate->prev)
494 tstate->prev->next = tstate->next;
495 if (tstate->next)
496 tstate->next->prev = tstate->prev;
497 tstate->prev = tstate->next = NULL;
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200498 interp->tstate_head = tstate;
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200499 HEAD_UNLOCK();
500 /* Clear and deallocate all stale thread states. Even if this
501 executes Python code, we should be safe since it executes
502 in the current thread, not one of the stale threads. */
503 for (p = garbage; p; p = next) {
504 next = p->next;
505 PyThreadState_Clear(p);
Victor Stinner1a7425f2013-07-07 16:25:15 +0200506 PyMem_RawFree(p);
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200507 }
508}
509
510
Guido van Rossuma027efa1997-05-05 20:56:21 +0000511PyThreadState *
Victor Stinnerbfd316e2016-01-20 11:12:38 +0100512_PyThreadState_UncheckedGet(void)
513{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100514 return GET_TSTATE();
Victor Stinnerbfd316e2016-01-20 11:12:38 +0100515}
516
517
518PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000519PyThreadState_Get(void)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000520{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100521 PyThreadState *tstate = GET_TSTATE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000522 if (tstate == NULL)
523 Py_FatalError("PyThreadState_Get: no current thread");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000524
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000525 return tstate;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000526}
527
528
529PyThreadState *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000530PyThreadState_Swap(PyThreadState *newts)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000531{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100532 PyThreadState *oldts = GET_TSTATE();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000533
Victor Stinnerb02ef712016-01-22 14:09:55 +0100534 SET_TSTATE(newts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000535 /* It should not be possible for more than one thread state
536 to be used for a thread. Check this the best we can in debug
537 builds.
538 */
Martin v. Löwis9e296252003-05-01 05:25:29 +0000539#if defined(Py_DEBUG) && defined(WITH_THREAD)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000540 if (newts) {
541 /* This can be called from PyEval_RestoreThread(). Similar
542 to it, we need to ensure errno doesn't change.
543 */
544 int err = errno;
545 PyThreadState *check = PyGILState_GetThisThreadState();
546 if (check && check->interp == newts->interp && check != newts)
547 Py_FatalError("Invalid thread state for this thread");
548 errno = err;
549 }
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000550#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000551 return oldts;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000552}
Guido van Rossumede04391998-04-10 20:18:25 +0000553
554/* An extension mechanism to store arbitrary additional per-thread state.
555 PyThreadState_GetDict() returns a dictionary that can be used to hold such
556 state; the caller should pick a unique key and store its state there. If
Guido van Rossum0fc8f002003-04-15 15:12:39 +0000557 PyThreadState_GetDict() returns NULL, an exception has *not* been raised
558 and the caller should assume no per-thread state is available. */
Guido van Rossumede04391998-04-10 20:18:25 +0000559
560PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000561PyThreadState_GetDict(void)
Guido van Rossumede04391998-04-10 20:18:25 +0000562{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100563 PyThreadState *tstate = GET_TSTATE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000564 if (tstate == NULL)
565 return NULL;
Guido van Rossumede04391998-04-10 20:18:25 +0000566
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000567 if (tstate->dict == NULL) {
568 PyObject *d;
569 tstate->dict = d = PyDict_New();
570 if (d == NULL)
571 PyErr_Clear();
572 }
573 return tstate->dict;
Guido van Rossumede04391998-04-10 20:18:25 +0000574}
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000575
576
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000577/* Asynchronously raise an exception in a thread.
578 Requested by Just van Rossum and Alex Martelli.
Guido van Rossum0f1f63c2005-02-08 02:07:57 +0000579 To prevent naive misuse, you must write your own extension
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000580 to call this, or use ctypes. Must be called with the GIL held.
581 Returns the number of tstates modified (normally 1, but 0 if `id` didn't
582 match any known thread id). Can be called with exc=NULL to clear an
583 existing async exception. This raises no exceptions. */
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000584
585int
586PyThreadState_SetAsyncExc(long id, PyObject *exc) {
Victor Stinnerb02ef712016-01-22 14:09:55 +0100587 PyInterpreterState *interp = GET_INTERP_STATE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000588 PyThreadState *p;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000589
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000590 /* Although the GIL is held, a few C API functions can be called
591 * without the GIL held, and in particular some that create and
592 * destroy thread and interpreter states. Those can mutate the
593 * list of thread states we're traversing, so to prevent that we lock
594 * head_mutex for the duration.
595 */
596 HEAD_LOCK();
597 for (p = interp->tstate_head; p != NULL; p = p->next) {
598 if (p->thread_id == id) {
599 /* Tricky: we need to decref the current value
600 * (if any) in p->async_exc, but that can in turn
601 * allow arbitrary Python code to run, including
602 * perhaps calls to this function. To prevent
603 * deadlock, we need to release head_mutex before
604 * the decref.
605 */
606 PyObject *old_exc = p->async_exc;
607 Py_XINCREF(exc);
608 p->async_exc = exc;
609 HEAD_UNLOCK();
610 Py_XDECREF(old_exc);
611 _PyEval_SignalAsyncExc();
612 return 1;
613 }
614 }
615 HEAD_UNLOCK();
616 return 0;
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000617}
618
619
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000620/* Routines for advanced debuggers, requested by David Beazley.
621 Don't use unless you know what you are doing! */
622
623PyInterpreterState *
624PyInterpreterState_Head(void)
625{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000626 return interp_head;
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000627}
628
629PyInterpreterState *
630PyInterpreterState_Next(PyInterpreterState *interp) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000631 return interp->next;
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000632}
633
634PyThreadState *
635PyInterpreterState_ThreadHead(PyInterpreterState *interp) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000636 return interp->tstate_head;
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000637}
638
639PyThreadState *
640PyThreadState_Next(PyThreadState *tstate) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000641 return tstate->next;
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000642}
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000643
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000644/* The implementation of sys._current_frames(). This is intended to be
645 called with the GIL held, as it will be when called via
646 sys._current_frames(). It's possible it would work fine even without
647 the GIL held, but haven't thought enough about that.
648*/
649PyObject *
650_PyThread_CurrentFrames(void)
651{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000652 PyObject *result;
653 PyInterpreterState *i;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000654
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000655 result = PyDict_New();
656 if (result == NULL)
657 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000658
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000659 /* for i in all interpreters:
660 * for t in all of i's thread states:
661 * if t's frame isn't NULL, map t's id to its frame
Ezio Melotti13925002011-03-16 11:05:33 +0200662 * Because these lists can mutate even when the GIL is held, we
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000663 * need to grab head_mutex for the duration.
664 */
665 HEAD_LOCK();
666 for (i = interp_head; i != NULL; i = i->next) {
667 PyThreadState *t;
668 for (t = i->tstate_head; t != NULL; t = t->next) {
669 PyObject *id;
670 int stat;
671 struct _frame *frame = t->frame;
672 if (frame == NULL)
673 continue;
674 id = PyLong_FromLong(t->thread_id);
675 if (id == NULL)
676 goto Fail;
677 stat = PyDict_SetItem(result, id, (PyObject *)frame);
678 Py_DECREF(id);
679 if (stat < 0)
680 goto Fail;
681 }
682 }
683 HEAD_UNLOCK();
684 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000685
686 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000687 HEAD_UNLOCK();
688 Py_DECREF(result);
689 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000690}
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000691
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000692/* Python "auto thread state" API. */
693#ifdef WITH_THREAD
694
695/* Keep this as a static, as it is not reliable! It can only
696 ever be compared to the state for the *current* thread.
697 * If not equal, then it doesn't matter that the actual
698 value may change immediately after comparison, as it can't
699 possibly change to the current thread's state.
700 * If equal, then the current thread holds the lock, so the value can't
701 change until we yield the lock.
702*/
703static int
704PyThreadState_IsCurrent(PyThreadState *tstate)
705{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000706 /* Must be the tstate for this thread */
707 assert(PyGILState_GetThisThreadState()==tstate);
Victor Stinnerb02ef712016-01-22 14:09:55 +0100708 return tstate == GET_TSTATE();
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000709}
710
Tim Peters4c1f5ec2004-10-09 17:25:05 +0000711/* Internal initialization/finalization functions called by
Martin Panterb4ce1fc2015-11-30 03:18:29 +0000712 Py_Initialize/Py_FinalizeEx
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000713*/
Tim Peters19717fa2004-10-09 17:38:29 +0000714void
715_PyGILState_Init(PyInterpreterState *i, PyThreadState *t)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000716{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000717 assert(i && t); /* must init with valid states */
718 autoTLSkey = PyThread_create_key();
Kristján Valur Jónsson2fea9b92010-09-20 02:11:49 +0000719 if (autoTLSkey == -1)
720 Py_FatalError("Could not allocate TLS entry");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000721 autoInterpreterState = i;
722 assert(PyThread_get_key_value(autoTLSkey) == NULL);
723 assert(t->gilstate_counter == 0);
Michael W. Hudson188d4362005-06-20 16:52:57 +0000724
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000725 _PyGILState_NoteThreadState(t);
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000726}
727
Victor Stinner861d9ab2016-03-16 22:45:24 +0100728PyInterpreterState *
729_PyGILState_GetInterpreterStateUnsafe(void)
730{
731 return autoInterpreterState;
732}
733
Tim Peters19717fa2004-10-09 17:38:29 +0000734void
735_PyGILState_Fini(void)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000736{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000737 PyThread_delete_key(autoTLSkey);
Victor Stinner8a1be612016-03-14 22:07:55 +0100738 autoTLSkey = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000739 autoInterpreterState = NULL;
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000740}
741
Charles-François Natalia233df82011-11-22 19:49:51 +0100742/* Reset the TLS key - called by PyOS_AfterFork().
Antoine Pitrou0c759fe2011-04-27 19:28:05 +0200743 * This should not be necessary, but some - buggy - pthread implementations
Charles-François Natalia233df82011-11-22 19:49:51 +0100744 * don't reset TLS upon fork(), see issue #10517.
Antoine Pitrou0c759fe2011-04-27 19:28:05 +0200745 */
746void
747_PyGILState_Reinit(void)
748{
749 PyThreadState *tstate = PyGILState_GetThisThreadState();
750 PyThread_delete_key(autoTLSkey);
751 if ((autoTLSkey = PyThread_create_key()) == -1)
752 Py_FatalError("Could not allocate TLS entry");
753
Charles-François Natalia233df82011-11-22 19:49:51 +0100754 /* If the thread had an associated auto thread state, reassociate it with
755 * the new key. */
756 if (tstate && PyThread_set_key_value(autoTLSkey, (void *)tstate) < 0)
Antoine Pitrou0c759fe2011-04-27 19:28:05 +0200757 Py_FatalError("Couldn't create autoTLSkey mapping");
758}
759
Michael W. Hudson188d4362005-06-20 16:52:57 +0000760/* When a thread state is created for a thread by some mechanism other than
761 PyGILState_Ensure, it's important that the GILState machinery knows about
762 it so it doesn't try to create another thread state for the thread (this is
763 a better fix for SF bug #1010677 than the first one attempted).
764*/
Thomas Wouters89f507f2006-12-13 04:49:30 +0000765static void
Michael W. Hudson188d4362005-06-20 16:52:57 +0000766_PyGILState_NoteThreadState(PyThreadState* tstate)
767{
Antoine Pitrou079ce542010-09-08 12:37:10 +0000768 /* If autoTLSkey isn't initialized, this must be the very first
769 threadstate created in Py_Initialize(). Don't do anything for now
770 (we'll be back here when _PyGILState_Init is called). */
771 if (!autoInterpreterState)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000772 return;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000773
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000774 /* Stick the thread state for this thread in thread local storage.
Michael W. Hudson188d4362005-06-20 16:52:57 +0000775
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000776 The only situation where you can legitimately have more than one
777 thread state for an OS level thread is when there are multiple
Victor Stinner590cebe2013-12-13 11:08:56 +0100778 interpreters.
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000779
Victor Stinner590cebe2013-12-13 11:08:56 +0100780 You shouldn't really be using the PyGILState_ APIs anyway (see issues
781 #10915 and #15751).
Michael W. Hudson188d4362005-06-20 16:52:57 +0000782
Victor Stinner590cebe2013-12-13 11:08:56 +0100783 The first thread state created for that given OS level thread will
784 "win", which seems reasonable behaviour.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000785 */
Victor Stinner590cebe2013-12-13 11:08:56 +0100786 if (PyThread_get_key_value(autoTLSkey) == NULL) {
787 if (PyThread_set_key_value(autoTLSkey, (void *)tstate) < 0)
788 Py_FatalError("Couldn't create autoTLSkey mapping");
789 }
Michael W. Hudson188d4362005-06-20 16:52:57 +0000790
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000791 /* PyGILState_Release must not try to delete this thread state. */
792 tstate->gilstate_counter = 1;
Michael W. Hudson188d4362005-06-20 16:52:57 +0000793}
794
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000795/* The public functions */
Tim Peters19717fa2004-10-09 17:38:29 +0000796PyThreadState *
797PyGILState_GetThisThreadState(void)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000798{
Antoine Pitrou079ce542010-09-08 12:37:10 +0000799 if (autoInterpreterState == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000800 return NULL;
801 return (PyThreadState *)PyThread_get_key_value(autoTLSkey);
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000802}
803
Kristján Valur Jónsson684cd0e2013-03-23 03:36:16 -0700804int
805PyGILState_Check(void)
806{
Victor Stinner8a1be612016-03-14 22:07:55 +0100807 PyThreadState *tstate;
808
809 if (!_PyGILState_check_enabled)
810 return 1;
811
812 if (autoTLSkey == -1)
813 return 1;
814
815 tstate = GET_TSTATE();
816 if (tstate == NULL)
817 return 0;
818
819 return (tstate == PyGILState_GetThisThreadState());
Kristján Valur Jónsson684cd0e2013-03-23 03:36:16 -0700820}
821
Tim Peters19717fa2004-10-09 17:38:29 +0000822PyGILState_STATE
823PyGILState_Ensure(void)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000824{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000825 int current;
826 PyThreadState *tcur;
827 /* Note that we do not auto-init Python here - apart from
828 potential races with 2 threads auto-initializing, pep-311
829 spells out other issues. Embedders are expected to have
830 called Py_Initialize() and usually PyEval_InitThreads().
831 */
832 assert(autoInterpreterState); /* Py_Initialize() hasn't been called! */
833 tcur = (PyThreadState *)PyThread_get_key_value(autoTLSkey);
834 if (tcur == NULL) {
Victor Stinner62ca1002013-12-13 01:46:43 +0100835 /* At startup, Python has no concrete GIL. If PyGILState_Ensure() is
836 called from a new thread for the first time, we need the create the
837 GIL. */
838 PyEval_InitThreads();
839
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000840 /* Create a new thread state for this thread */
841 tcur = PyThreadState_New(autoInterpreterState);
842 if (tcur == NULL)
843 Py_FatalError("Couldn't create thread-state for new thread");
844 /* This is our thread state! We'll need to delete it in the
845 matching call to PyGILState_Release(). */
846 tcur->gilstate_counter = 0;
847 current = 0; /* new thread state is never current */
848 }
849 else
850 current = PyThreadState_IsCurrent(tcur);
851 if (current == 0)
852 PyEval_RestoreThread(tcur);
853 /* Update our counter in the thread-state - no need for locks:
854 - tcur will remain valid as we hold the GIL.
855 - the counter is safe as we are the only thread "allowed"
856 to modify this value
857 */
858 ++tcur->gilstate_counter;
859 return current ? PyGILState_LOCKED : PyGILState_UNLOCKED;
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000860}
861
Tim Peters19717fa2004-10-09 17:38:29 +0000862void
863PyGILState_Release(PyGILState_STATE oldstate)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000864{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000865 PyThreadState *tcur = (PyThreadState *)PyThread_get_key_value(
866 autoTLSkey);
867 if (tcur == NULL)
868 Py_FatalError("auto-releasing thread-state, "
869 "but no thread-state for this thread");
870 /* We must hold the GIL and have our thread state current */
871 /* XXX - remove the check - the assert should be fine,
872 but while this is very new (April 2003), the extra check
873 by release-only users can't hurt.
874 */
875 if (! PyThreadState_IsCurrent(tcur))
876 Py_FatalError("This thread state must be current when releasing");
877 assert(PyThreadState_IsCurrent(tcur));
878 --tcur->gilstate_counter;
879 assert(tcur->gilstate_counter >= 0); /* illegal counter value */
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000880
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000881 /* If we're going to destroy this thread-state, we must
882 * clear it while the GIL is held, as destructors may run.
883 */
884 if (tcur->gilstate_counter == 0) {
885 /* can't have been locked when we created it */
886 assert(oldstate == PyGILState_UNLOCKED);
887 PyThreadState_Clear(tcur);
888 /* Delete the thread-state. Note this releases the GIL too!
889 * It's vital that the GIL be held here, to avoid shutdown
890 * races; see bugs 225673 and 1061968 (that nasty bug has a
891 * habit of coming back).
892 */
893 PyThreadState_DeleteCurrent();
894 }
895 /* Release the lock if necessary */
896 else if (oldstate == PyGILState_UNLOCKED)
897 PyEval_SaveThread();
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000898}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000899
Benjamin Peterson3bf01752012-04-13 18:06:36 -0400900#endif /* WITH_THREAD */
901
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000902#ifdef __cplusplus
903}
904#endif
905
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000906