blob: 25110b287ffacce97b728da304977ad3ef69906f [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) \
9 _Py_atomic_store_relaxed(&_PyThreadState_Current, (Py_uintptr_t)(value))
10#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;
Martin v. Löwisf0473d52001-07-18 16:17:16 +000094#ifdef HAVE_DLOPEN
Serhiy Storchakac2f7d872016-05-04 09:44:44 +030095#if HAVE_DECL_RTLD_NOW
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000096 interp->dlopenflags = RTLD_NOW;
Martin v. Löwisf0473d52001-07-18 16:17:16 +000097#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000098 interp->dlopenflags = RTLD_LAZY;
Martin v. Löwisf0473d52001-07-18 16:17:16 +000099#endif
100#endif
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000101#ifdef WITH_TSC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000102 interp->tscdump = 0;
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000103#endif
Guido van Rossum25ce5661997-08-02 03:10:38 +0000104
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000105 HEAD_LOCK();
106 interp->next = interp_head;
107 interp_head = interp;
108 HEAD_UNLOCK();
109 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000110
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000111 return interp;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000112}
113
114
115void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000116PyInterpreterState_Clear(PyInterpreterState *interp)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000117{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000118 PyThreadState *p;
119 HEAD_LOCK();
120 for (p = interp->tstate_head; p != NULL; p = p->next)
121 PyThreadState_Clear(p);
122 HEAD_UNLOCK();
123 Py_CLEAR(interp->codec_search_path);
124 Py_CLEAR(interp->codec_search_cache);
125 Py_CLEAR(interp->codec_error_registry);
126 Py_CLEAR(interp->modules);
127 Py_CLEAR(interp->modules_by_index);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000128 Py_CLEAR(interp->sysdict);
129 Py_CLEAR(interp->builtins);
Serhiy Storchaka87a5c512014-02-10 18:21:34 +0200130 Py_CLEAR(interp->builtins_copy);
Brett Cannonfd074152012-04-14 14:10:13 -0400131 Py_CLEAR(interp->importlib);
Serhiy Storchaka133138a2016-08-02 22:51:21 +0300132 Py_CLEAR(interp->import_func);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000133}
134
135
136static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000137zapthreads(PyInterpreterState *interp)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000138{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000139 PyThreadState *p;
140 /* No need to lock the mutex here because this should only happen
141 when the threads are all really dead (XXX famous last words). */
142 while ((p = interp->tstate_head) != NULL) {
143 PyThreadState_Delete(p);
144 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000145}
146
147
148void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000149PyInterpreterState_Delete(PyInterpreterState *interp)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000150{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000151 PyInterpreterState **p;
152 zapthreads(interp);
153 HEAD_LOCK();
154 for (p = &interp_head; ; p = &(*p)->next) {
155 if (*p == NULL)
156 Py_FatalError(
157 "PyInterpreterState_Delete: invalid interp");
158 if (*p == interp)
159 break;
160 }
161 if (interp->tstate_head != NULL)
162 Py_FatalError("PyInterpreterState_Delete: remaining threads");
163 *p = interp->next;
164 HEAD_UNLOCK();
Victor Stinner1a7425f2013-07-07 16:25:15 +0200165 PyMem_RawFree(interp);
Antoine Pitrou8db076c2011-10-30 19:13:55 +0100166#ifdef WITH_THREAD
167 if (interp_head == NULL && head_mutex != NULL) {
168 PyThread_free_lock(head_mutex);
169 head_mutex = NULL;
170 }
171#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000172}
173
174
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000175/* Default implementation for _PyThreadState_GetFrame */
176static struct _frame *
177threadstate_getframe(PyThreadState *self)
178{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000179 return self->frame;
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000180}
181
Victor Stinner45b9be52010-03-03 23:28:07 +0000182static PyThreadState *
183new_threadstate(PyInterpreterState *interp, int init)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000184{
Victor Stinner1a7425f2013-07-07 16:25:15 +0200185 PyThreadState *tstate = (PyThreadState *)PyMem_RawMalloc(sizeof(PyThreadState));
Tim Peters84705582004-10-10 02:47:33 +0000186
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000187 if (_PyThreadState_GetFrame == NULL)
188 _PyThreadState_GetFrame = threadstate_getframe;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000189
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000190 if (tstate != NULL) {
191 tstate->interp = interp;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000192
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000193 tstate->frame = NULL;
194 tstate->recursion_depth = 0;
195 tstate->overflowed = 0;
196 tstate->recursion_critical = 0;
197 tstate->tracing = 0;
198 tstate->use_tracing = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000199 tstate->gilstate_counter = 0;
200 tstate->async_exc = NULL;
Martin v. Löwisf9ce67d2003-07-13 10:41:53 +0000201#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000202 tstate->thread_id = PyThread_get_thread_ident();
Martin v. Löwisf9ce67d2003-07-13 10:41:53 +0000203#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000204 tstate->thread_id = 0;
Martin v. Löwisf9ce67d2003-07-13 10:41:53 +0000205#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000206
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000207 tstate->dict = NULL;
Guido van Rossumede04391998-04-10 20:18:25 +0000208
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000209 tstate->curexc_type = NULL;
210 tstate->curexc_value = NULL;
211 tstate->curexc_traceback = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000212
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000213 tstate->exc_type = NULL;
214 tstate->exc_value = NULL;
215 tstate->exc_traceback = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000216
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000217 tstate->c_profilefunc = NULL;
218 tstate->c_tracefunc = NULL;
219 tstate->c_profileobj = NULL;
220 tstate->c_traceobj = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000221
Antoine Pitrou2b0218a2012-09-06 00:59:49 +0200222 tstate->trash_delete_nesting = 0;
223 tstate->trash_delete_later = NULL;
Antoine Pitrou7b476992013-09-07 23:38:37 +0200224 tstate->on_delete = NULL;
225 tstate->on_delete_data = NULL;
Antoine Pitrou2b0218a2012-09-06 00:59:49 +0200226
Yury Selivanov75445082015-05-11 22:57:16 -0400227 tstate->coroutine_wrapper = NULL;
Yury Selivanovaab3c4a2015-06-02 18:43:51 -0400228 tstate->in_coroutine_wrapper = 0;
Yury Selivanov75445082015-05-11 22:57:16 -0400229
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000230 if (init)
231 _PyThreadState_Init(tstate);
Michael W. Hudson188d4362005-06-20 16:52:57 +0000232
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000233 HEAD_LOCK();
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200234 tstate->prev = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000235 tstate->next = interp->tstate_head;
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200236 if (tstate->next)
237 tstate->next->prev = tstate;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000238 interp->tstate_head = tstate;
239 HEAD_UNLOCK();
240 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000241
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000242 return tstate;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000243}
244
Victor Stinner45b9be52010-03-03 23:28:07 +0000245PyThreadState *
246PyThreadState_New(PyInterpreterState *interp)
247{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000248 return new_threadstate(interp, 1);
Victor Stinner45b9be52010-03-03 23:28:07 +0000249}
250
251PyThreadState *
252_PyThreadState_Prealloc(PyInterpreterState *interp)
253{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000254 return new_threadstate(interp, 0);
Victor Stinner45b9be52010-03-03 23:28:07 +0000255}
256
257void
258_PyThreadState_Init(PyThreadState *tstate)
259{
260#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000261 _PyGILState_NoteThreadState(tstate);
Victor Stinner45b9be52010-03-03 23:28:07 +0000262#endif
263}
264
Martin v. Löwis1a214512008-06-11 05:26:20 +0000265PyObject*
Martin v. Löwis7800f752012-06-22 12:20:55 +0200266PyState_FindModule(struct PyModuleDef* module)
Martin v. Löwis1a214512008-06-11 05:26:20 +0000267{
Martin v. Löwis7800f752012-06-22 12:20:55 +0200268 Py_ssize_t index = module->m_base.m_index;
Victor Stinnerb02ef712016-01-22 14:09:55 +0100269 PyInterpreterState *state = GET_INTERP_STATE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000270 PyObject *res;
Nick Coghland5cacbb2015-05-23 22:24:10 +1000271 if (module->m_slots) {
272 return NULL;
273 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000274 if (index == 0)
275 return NULL;
276 if (state->modules_by_index == NULL)
277 return NULL;
Antoine Pitrou75506e82012-08-20 19:30:46 +0200278 if (index >= PyList_GET_SIZE(state->modules_by_index))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000279 return NULL;
280 res = PyList_GET_ITEM(state->modules_by_index, index);
281 return res==Py_None ? NULL : res;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000282}
283
284int
285_PyState_AddModule(PyObject* module, struct PyModuleDef* def)
286{
Nick Coghland5cacbb2015-05-23 22:24:10 +1000287 PyInterpreterState *state;
Berker Peksag4b7b5652016-08-22 18:05:56 +0300288 if (!def) {
289 assert(PyErr_Occurred());
290 return -1;
291 }
Nick Coghland5cacbb2015-05-23 22:24:10 +1000292 if (def->m_slots) {
293 PyErr_SetString(PyExc_SystemError,
294 "PyState_AddModule called on module with slots");
295 return -1;
296 }
Victor Stinnerb02ef712016-01-22 14:09:55 +0100297 state = GET_INTERP_STATE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000298 if (!state->modules_by_index) {
299 state->modules_by_index = PyList_New(0);
300 if (!state->modules_by_index)
301 return -1;
302 }
303 while(PyList_GET_SIZE(state->modules_by_index) <= def->m_base.m_index)
304 if (PyList_Append(state->modules_by_index, Py_None) < 0)
305 return -1;
306 Py_INCREF(module);
307 return PyList_SetItem(state->modules_by_index,
308 def->m_base.m_index, module);
Martin v. Löwis1a214512008-06-11 05:26:20 +0000309}
Guido van Rossuma027efa1997-05-05 20:56:21 +0000310
Martin v. Löwis7800f752012-06-22 12:20:55 +0200311int
312PyState_AddModule(PyObject* module, struct PyModuleDef* def)
313{
314 Py_ssize_t index;
Victor Stinnerb02ef712016-01-22 14:09:55 +0100315 PyInterpreterState *state = GET_INTERP_STATE();
Martin v. Löwis7800f752012-06-22 12:20:55 +0200316 if (!def) {
317 Py_FatalError("PyState_AddModule: Module Definition is NULL");
318 return -1;
319 }
320 index = def->m_base.m_index;
321 if (state->modules_by_index) {
322 if(PyList_GET_SIZE(state->modules_by_index) >= index) {
323 if(module == PyList_GET_ITEM(state->modules_by_index, index)) {
324 Py_FatalError("PyState_AddModule: Module already added!");
325 return -1;
326 }
327 }
328 }
329 return _PyState_AddModule(module, def);
330}
331
332int
333PyState_RemoveModule(struct PyModuleDef* def)
334{
Nick Coghland5cacbb2015-05-23 22:24:10 +1000335 PyInterpreterState *state;
Martin v. Löwis7800f752012-06-22 12:20:55 +0200336 Py_ssize_t index = def->m_base.m_index;
Nick Coghland5cacbb2015-05-23 22:24:10 +1000337 if (def->m_slots) {
338 PyErr_SetString(PyExc_SystemError,
339 "PyState_RemoveModule called on module with slots");
340 return -1;
341 }
Victor Stinnerb02ef712016-01-22 14:09:55 +0100342 state = GET_INTERP_STATE();
Martin v. Löwis7800f752012-06-22 12:20:55 +0200343 if (index == 0) {
344 Py_FatalError("PyState_RemoveModule: Module index invalid.");
345 return -1;
346 }
347 if (state->modules_by_index == NULL) {
348 Py_FatalError("PyState_RemoveModule: Interpreters module-list not acessible.");
349 return -1;
350 }
351 if (index > PyList_GET_SIZE(state->modules_by_index)) {
352 Py_FatalError("PyState_RemoveModule: Module index out of bounds.");
353 return -1;
354 }
355 return PyList_SetItem(state->modules_by_index, index, Py_None);
356}
357
Antoine Pitrou40322e62013-08-11 00:30:09 +0200358/* used by import.c:PyImport_Cleanup */
359void
360_PyState_ClearModules(void)
361{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100362 PyInterpreterState *state = GET_INTERP_STATE();
Antoine Pitrou40322e62013-08-11 00:30:09 +0200363 if (state->modules_by_index) {
364 Py_ssize_t i;
365 for (i = 0; i < PyList_GET_SIZE(state->modules_by_index); i++) {
366 PyObject *m = PyList_GET_ITEM(state->modules_by_index, i);
367 if (PyModule_Check(m)) {
368 /* cleanup the saved copy of module dicts */
369 PyModuleDef *md = PyModule_GetDef(m);
370 if (md)
371 Py_CLEAR(md->m_base.m_copy);
372 }
373 }
374 /* Setting modules_by_index to NULL could be dangerous, so we
375 clear the list instead. */
376 if (PyList_SetSlice(state->modules_by_index,
377 0, PyList_GET_SIZE(state->modules_by_index),
378 NULL))
379 PyErr_WriteUnraisable(state->modules_by_index);
380 }
381}
382
Guido van Rossuma027efa1997-05-05 20:56:21 +0000383void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000384PyThreadState_Clear(PyThreadState *tstate)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000385{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000386 if (Py_VerboseFlag && tstate->frame != NULL)
387 fprintf(stderr,
388 "PyThreadState_Clear: warning: thread still has a frame\n");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000389
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000390 Py_CLEAR(tstate->frame);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000391
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000392 Py_CLEAR(tstate->dict);
393 Py_CLEAR(tstate->async_exc);
Guido van Rossumede04391998-04-10 20:18:25 +0000394
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000395 Py_CLEAR(tstate->curexc_type);
396 Py_CLEAR(tstate->curexc_value);
397 Py_CLEAR(tstate->curexc_traceback);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000398
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000399 Py_CLEAR(tstate->exc_type);
400 Py_CLEAR(tstate->exc_value);
401 Py_CLEAR(tstate->exc_traceback);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000402
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000403 tstate->c_profilefunc = NULL;
404 tstate->c_tracefunc = NULL;
405 Py_CLEAR(tstate->c_profileobj);
406 Py_CLEAR(tstate->c_traceobj);
Yury Selivanov75445082015-05-11 22:57:16 -0400407
408 Py_CLEAR(tstate->coroutine_wrapper);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000409}
410
411
Guido van Rossum29757862001-01-23 01:46:06 +0000412/* Common code for PyThreadState_Delete() and PyThreadState_DeleteCurrent() */
413static void
414tstate_delete_common(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000415{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000416 PyInterpreterState *interp;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000417 if (tstate == NULL)
418 Py_FatalError("PyThreadState_Delete: NULL tstate");
419 interp = tstate->interp;
420 if (interp == NULL)
421 Py_FatalError("PyThreadState_Delete: NULL interp");
422 HEAD_LOCK();
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200423 if (tstate->prev)
424 tstate->prev->next = tstate->next;
425 else
426 interp->tstate_head = tstate->next;
427 if (tstate->next)
428 tstate->next->prev = tstate->prev;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000429 HEAD_UNLOCK();
Antoine Pitrou7b476992013-09-07 23:38:37 +0200430 if (tstate->on_delete != NULL) {
431 tstate->on_delete(tstate->on_delete_data);
432 }
Victor Stinner1a7425f2013-07-07 16:25:15 +0200433 PyMem_RawFree(tstate);
Guido van Rossuma027efa1997-05-05 20:56:21 +0000434}
435
436
Guido van Rossum29757862001-01-23 01:46:06 +0000437void
438PyThreadState_Delete(PyThreadState *tstate)
439{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100440 if (tstate == GET_TSTATE())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000441 Py_FatalError("PyThreadState_Delete: tstate is still current");
Tim Petersf4e69282006-02-27 17:15:31 +0000442#ifdef WITH_THREAD
Antoine Pitrou079ce542010-09-08 12:37:10 +0000443 if (autoInterpreterState && PyThread_get_key_value(autoTLSkey) == tstate)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000444 PyThread_delete_key_value(autoTLSkey);
Tim Petersf4e69282006-02-27 17:15:31 +0000445#endif /* WITH_THREAD */
Christian Heimesb9dbc7d2013-07-01 23:42:28 +0200446 tstate_delete_common(tstate);
Guido van Rossum29757862001-01-23 01:46:06 +0000447}
448
449
450#ifdef WITH_THREAD
451void
452PyThreadState_DeleteCurrent()
453{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100454 PyThreadState *tstate = GET_TSTATE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000455 if (tstate == NULL)
456 Py_FatalError(
457 "PyThreadState_DeleteCurrent: no current tstate");
Victor Stinner8a1be612016-03-14 22:07:55 +0100458 tstate_delete_common(tstate);
Antoine Pitrou079ce542010-09-08 12:37:10 +0000459 if (autoInterpreterState && PyThread_get_key_value(autoTLSkey) == tstate)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000460 PyThread_delete_key_value(autoTLSkey);
Victor Stinner8a1be612016-03-14 22:07:55 +0100461 SET_TSTATE(NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000462 PyEval_ReleaseLock();
Guido van Rossum29757862001-01-23 01:46:06 +0000463}
464#endif /* WITH_THREAD */
465
466
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200467/*
468 * Delete all thread states except the one passed as argument.
469 * Note that, if there is a current thread state, it *must* be the one
470 * passed as argument. Also, this won't touch any other interpreters
471 * than the current one, since we don't know which thread state should
472 * be kept in those other interpreteres.
473 */
474void
475_PyThreadState_DeleteExcept(PyThreadState *tstate)
476{
477 PyInterpreterState *interp = tstate->interp;
478 PyThreadState *p, *next, *garbage;
479 HEAD_LOCK();
480 /* Remove all thread states, except tstate, from the linked list of
481 thread states. This will allow calling PyThreadState_Clear()
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200482 without holding the lock. */
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200483 garbage = interp->tstate_head;
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200484 if (garbage == tstate)
485 garbage = tstate->next;
486 if (tstate->prev)
487 tstate->prev->next = tstate->next;
488 if (tstate->next)
489 tstate->next->prev = tstate->prev;
490 tstate->prev = tstate->next = NULL;
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200491 interp->tstate_head = tstate;
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200492 HEAD_UNLOCK();
493 /* Clear and deallocate all stale thread states. Even if this
494 executes Python code, we should be safe since it executes
495 in the current thread, not one of the stale threads. */
496 for (p = garbage; p; p = next) {
497 next = p->next;
498 PyThreadState_Clear(p);
Victor Stinner1a7425f2013-07-07 16:25:15 +0200499 PyMem_RawFree(p);
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200500 }
501}
502
503
Guido van Rossuma027efa1997-05-05 20:56:21 +0000504PyThreadState *
Victor Stinnerbfd316e2016-01-20 11:12:38 +0100505_PyThreadState_UncheckedGet(void)
506{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100507 return GET_TSTATE();
Victor Stinnerbfd316e2016-01-20 11:12:38 +0100508}
509
510
511PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000512PyThreadState_Get(void)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000513{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100514 PyThreadState *tstate = GET_TSTATE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000515 if (tstate == NULL)
516 Py_FatalError("PyThreadState_Get: no current thread");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000517
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000518 return tstate;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000519}
520
521
522PyThreadState *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000523PyThreadState_Swap(PyThreadState *newts)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000524{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100525 PyThreadState *oldts = GET_TSTATE();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000526
Victor Stinnerb02ef712016-01-22 14:09:55 +0100527 SET_TSTATE(newts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000528 /* It should not be possible for more than one thread state
529 to be used for a thread. Check this the best we can in debug
530 builds.
531 */
Martin v. Löwis9e296252003-05-01 05:25:29 +0000532#if defined(Py_DEBUG) && defined(WITH_THREAD)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000533 if (newts) {
534 /* This can be called from PyEval_RestoreThread(). Similar
535 to it, we need to ensure errno doesn't change.
536 */
537 int err = errno;
538 PyThreadState *check = PyGILState_GetThisThreadState();
539 if (check && check->interp == newts->interp && check != newts)
540 Py_FatalError("Invalid thread state for this thread");
541 errno = err;
542 }
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000543#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000544 return oldts;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000545}
Guido van Rossumede04391998-04-10 20:18:25 +0000546
547/* An extension mechanism to store arbitrary additional per-thread state.
548 PyThreadState_GetDict() returns a dictionary that can be used to hold such
549 state; the caller should pick a unique key and store its state there. If
Guido van Rossum0fc8f002003-04-15 15:12:39 +0000550 PyThreadState_GetDict() returns NULL, an exception has *not* been raised
551 and the caller should assume no per-thread state is available. */
Guido van Rossumede04391998-04-10 20:18:25 +0000552
553PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000554PyThreadState_GetDict(void)
Guido van Rossumede04391998-04-10 20:18:25 +0000555{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100556 PyThreadState *tstate = GET_TSTATE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000557 if (tstate == NULL)
558 return NULL;
Guido van Rossumede04391998-04-10 20:18:25 +0000559
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000560 if (tstate->dict == NULL) {
561 PyObject *d;
562 tstate->dict = d = PyDict_New();
563 if (d == NULL)
564 PyErr_Clear();
565 }
566 return tstate->dict;
Guido van Rossumede04391998-04-10 20:18:25 +0000567}
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000568
569
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000570/* Asynchronously raise an exception in a thread.
571 Requested by Just van Rossum and Alex Martelli.
Guido van Rossum0f1f63c2005-02-08 02:07:57 +0000572 To prevent naive misuse, you must write your own extension
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000573 to call this, or use ctypes. Must be called with the GIL held.
574 Returns the number of tstates modified (normally 1, but 0 if `id` didn't
575 match any known thread id). Can be called with exc=NULL to clear an
576 existing async exception. This raises no exceptions. */
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000577
578int
579PyThreadState_SetAsyncExc(long id, PyObject *exc) {
Victor Stinnerb02ef712016-01-22 14:09:55 +0100580 PyInterpreterState *interp = GET_INTERP_STATE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000581 PyThreadState *p;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000582
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000583 /* Although the GIL is held, a few C API functions can be called
584 * without the GIL held, and in particular some that create and
585 * destroy thread and interpreter states. Those can mutate the
586 * list of thread states we're traversing, so to prevent that we lock
587 * head_mutex for the duration.
588 */
589 HEAD_LOCK();
590 for (p = interp->tstate_head; p != NULL; p = p->next) {
591 if (p->thread_id == id) {
592 /* Tricky: we need to decref the current value
593 * (if any) in p->async_exc, but that can in turn
594 * allow arbitrary Python code to run, including
595 * perhaps calls to this function. To prevent
596 * deadlock, we need to release head_mutex before
597 * the decref.
598 */
599 PyObject *old_exc = p->async_exc;
600 Py_XINCREF(exc);
601 p->async_exc = exc;
602 HEAD_UNLOCK();
603 Py_XDECREF(old_exc);
604 _PyEval_SignalAsyncExc();
605 return 1;
606 }
607 }
608 HEAD_UNLOCK();
609 return 0;
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000610}
611
612
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000613/* Routines for advanced debuggers, requested by David Beazley.
614 Don't use unless you know what you are doing! */
615
616PyInterpreterState *
617PyInterpreterState_Head(void)
618{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000619 return interp_head;
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000620}
621
622PyInterpreterState *
623PyInterpreterState_Next(PyInterpreterState *interp) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000624 return interp->next;
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000625}
626
627PyThreadState *
628PyInterpreterState_ThreadHead(PyInterpreterState *interp) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000629 return interp->tstate_head;
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000630}
631
632PyThreadState *
633PyThreadState_Next(PyThreadState *tstate) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000634 return tstate->next;
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000635}
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000636
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000637/* The implementation of sys._current_frames(). This is intended to be
638 called with the GIL held, as it will be when called via
639 sys._current_frames(). It's possible it would work fine even without
640 the GIL held, but haven't thought enough about that.
641*/
642PyObject *
643_PyThread_CurrentFrames(void)
644{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000645 PyObject *result;
646 PyInterpreterState *i;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000647
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000648 result = PyDict_New();
649 if (result == NULL)
650 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000651
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000652 /* for i in all interpreters:
653 * for t in all of i's thread states:
654 * if t's frame isn't NULL, map t's id to its frame
Ezio Melotti13925002011-03-16 11:05:33 +0200655 * Because these lists can mutate even when the GIL is held, we
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000656 * need to grab head_mutex for the duration.
657 */
658 HEAD_LOCK();
659 for (i = interp_head; i != NULL; i = i->next) {
660 PyThreadState *t;
661 for (t = i->tstate_head; t != NULL; t = t->next) {
662 PyObject *id;
663 int stat;
664 struct _frame *frame = t->frame;
665 if (frame == NULL)
666 continue;
667 id = PyLong_FromLong(t->thread_id);
668 if (id == NULL)
669 goto Fail;
670 stat = PyDict_SetItem(result, id, (PyObject *)frame);
671 Py_DECREF(id);
672 if (stat < 0)
673 goto Fail;
674 }
675 }
676 HEAD_UNLOCK();
677 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000678
679 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000680 HEAD_UNLOCK();
681 Py_DECREF(result);
682 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000683}
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000684
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000685/* Python "auto thread state" API. */
686#ifdef WITH_THREAD
687
688/* Keep this as a static, as it is not reliable! It can only
689 ever be compared to the state for the *current* thread.
690 * If not equal, then it doesn't matter that the actual
691 value may change immediately after comparison, as it can't
692 possibly change to the current thread's state.
693 * If equal, then the current thread holds the lock, so the value can't
694 change until we yield the lock.
695*/
696static int
697PyThreadState_IsCurrent(PyThreadState *tstate)
698{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000699 /* Must be the tstate for this thread */
700 assert(PyGILState_GetThisThreadState()==tstate);
Victor Stinnerb02ef712016-01-22 14:09:55 +0100701 return tstate == GET_TSTATE();
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000702}
703
Tim Peters4c1f5ec2004-10-09 17:25:05 +0000704/* Internal initialization/finalization functions called by
Martin Panterb4ce1fc2015-11-30 03:18:29 +0000705 Py_Initialize/Py_FinalizeEx
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000706*/
Tim Peters19717fa2004-10-09 17:38:29 +0000707void
708_PyGILState_Init(PyInterpreterState *i, PyThreadState *t)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000709{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000710 assert(i && t); /* must init with valid states */
711 autoTLSkey = PyThread_create_key();
Kristján Valur Jónsson2fea9b92010-09-20 02:11:49 +0000712 if (autoTLSkey == -1)
713 Py_FatalError("Could not allocate TLS entry");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000714 autoInterpreterState = i;
715 assert(PyThread_get_key_value(autoTLSkey) == NULL);
716 assert(t->gilstate_counter == 0);
Michael W. Hudson188d4362005-06-20 16:52:57 +0000717
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000718 _PyGILState_NoteThreadState(t);
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000719}
720
Victor Stinner861d9ab2016-03-16 22:45:24 +0100721PyInterpreterState *
722_PyGILState_GetInterpreterStateUnsafe(void)
723{
724 return autoInterpreterState;
725}
726
Tim Peters19717fa2004-10-09 17:38:29 +0000727void
728_PyGILState_Fini(void)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000729{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000730 PyThread_delete_key(autoTLSkey);
Victor Stinner8a1be612016-03-14 22:07:55 +0100731 autoTLSkey = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000732 autoInterpreterState = NULL;
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000733}
734
Charles-François Natalia233df82011-11-22 19:49:51 +0100735/* Reset the TLS key - called by PyOS_AfterFork().
Antoine Pitrou0c759fe2011-04-27 19:28:05 +0200736 * This should not be necessary, but some - buggy - pthread implementations
Charles-François Natalia233df82011-11-22 19:49:51 +0100737 * don't reset TLS upon fork(), see issue #10517.
Antoine Pitrou0c759fe2011-04-27 19:28:05 +0200738 */
739void
740_PyGILState_Reinit(void)
741{
742 PyThreadState *tstate = PyGILState_GetThisThreadState();
743 PyThread_delete_key(autoTLSkey);
744 if ((autoTLSkey = PyThread_create_key()) == -1)
745 Py_FatalError("Could not allocate TLS entry");
746
Charles-François Natalia233df82011-11-22 19:49:51 +0100747 /* If the thread had an associated auto thread state, reassociate it with
748 * the new key. */
749 if (tstate && PyThread_set_key_value(autoTLSkey, (void *)tstate) < 0)
Antoine Pitrou0c759fe2011-04-27 19:28:05 +0200750 Py_FatalError("Couldn't create autoTLSkey mapping");
751}
752
Michael W. Hudson188d4362005-06-20 16:52:57 +0000753/* When a thread state is created for a thread by some mechanism other than
754 PyGILState_Ensure, it's important that the GILState machinery knows about
755 it so it doesn't try to create another thread state for the thread (this is
756 a better fix for SF bug #1010677 than the first one attempted).
757*/
Thomas Wouters89f507f2006-12-13 04:49:30 +0000758static void
Michael W. Hudson188d4362005-06-20 16:52:57 +0000759_PyGILState_NoteThreadState(PyThreadState* tstate)
760{
Antoine Pitrou079ce542010-09-08 12:37:10 +0000761 /* If autoTLSkey isn't initialized, this must be the very first
762 threadstate created in Py_Initialize(). Don't do anything for now
763 (we'll be back here when _PyGILState_Init is called). */
764 if (!autoInterpreterState)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000765 return;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000766
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000767 /* Stick the thread state for this thread in thread local storage.
Michael W. Hudson188d4362005-06-20 16:52:57 +0000768
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000769 The only situation where you can legitimately have more than one
770 thread state for an OS level thread is when there are multiple
Victor Stinner590cebe2013-12-13 11:08:56 +0100771 interpreters.
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000772
Victor Stinner590cebe2013-12-13 11:08:56 +0100773 You shouldn't really be using the PyGILState_ APIs anyway (see issues
774 #10915 and #15751).
Michael W. Hudson188d4362005-06-20 16:52:57 +0000775
Victor Stinner590cebe2013-12-13 11:08:56 +0100776 The first thread state created for that given OS level thread will
777 "win", which seems reasonable behaviour.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000778 */
Victor Stinner590cebe2013-12-13 11:08:56 +0100779 if (PyThread_get_key_value(autoTLSkey) == NULL) {
780 if (PyThread_set_key_value(autoTLSkey, (void *)tstate) < 0)
781 Py_FatalError("Couldn't create autoTLSkey mapping");
782 }
Michael W. Hudson188d4362005-06-20 16:52:57 +0000783
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000784 /* PyGILState_Release must not try to delete this thread state. */
785 tstate->gilstate_counter = 1;
Michael W. Hudson188d4362005-06-20 16:52:57 +0000786}
787
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000788/* The public functions */
Tim Peters19717fa2004-10-09 17:38:29 +0000789PyThreadState *
790PyGILState_GetThisThreadState(void)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000791{
Antoine Pitrou079ce542010-09-08 12:37:10 +0000792 if (autoInterpreterState == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000793 return NULL;
794 return (PyThreadState *)PyThread_get_key_value(autoTLSkey);
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000795}
796
Kristján Valur Jónsson684cd0e2013-03-23 03:36:16 -0700797int
798PyGILState_Check(void)
799{
Victor Stinner8a1be612016-03-14 22:07:55 +0100800 PyThreadState *tstate;
801
802 if (!_PyGILState_check_enabled)
803 return 1;
804
805 if (autoTLSkey == -1)
806 return 1;
807
808 tstate = GET_TSTATE();
809 if (tstate == NULL)
810 return 0;
811
812 return (tstate == PyGILState_GetThisThreadState());
Kristján Valur Jónsson684cd0e2013-03-23 03:36:16 -0700813}
814
Tim Peters19717fa2004-10-09 17:38:29 +0000815PyGILState_STATE
816PyGILState_Ensure(void)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000817{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000818 int current;
819 PyThreadState *tcur;
820 /* Note that we do not auto-init Python here - apart from
821 potential races with 2 threads auto-initializing, pep-311
822 spells out other issues. Embedders are expected to have
823 called Py_Initialize() and usually PyEval_InitThreads().
824 */
825 assert(autoInterpreterState); /* Py_Initialize() hasn't been called! */
826 tcur = (PyThreadState *)PyThread_get_key_value(autoTLSkey);
827 if (tcur == NULL) {
Victor Stinner62ca1002013-12-13 01:46:43 +0100828 /* At startup, Python has no concrete GIL. If PyGILState_Ensure() is
829 called from a new thread for the first time, we need the create the
830 GIL. */
831 PyEval_InitThreads();
832
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000833 /* Create a new thread state for this thread */
834 tcur = PyThreadState_New(autoInterpreterState);
835 if (tcur == NULL)
836 Py_FatalError("Couldn't create thread-state for new thread");
837 /* This is our thread state! We'll need to delete it in the
838 matching call to PyGILState_Release(). */
839 tcur->gilstate_counter = 0;
840 current = 0; /* new thread state is never current */
841 }
842 else
843 current = PyThreadState_IsCurrent(tcur);
844 if (current == 0)
845 PyEval_RestoreThread(tcur);
846 /* Update our counter in the thread-state - no need for locks:
847 - tcur will remain valid as we hold the GIL.
848 - the counter is safe as we are the only thread "allowed"
849 to modify this value
850 */
851 ++tcur->gilstate_counter;
852 return current ? PyGILState_LOCKED : PyGILState_UNLOCKED;
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000853}
854
Tim Peters19717fa2004-10-09 17:38:29 +0000855void
856PyGILState_Release(PyGILState_STATE oldstate)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000857{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000858 PyThreadState *tcur = (PyThreadState *)PyThread_get_key_value(
859 autoTLSkey);
860 if (tcur == NULL)
861 Py_FatalError("auto-releasing thread-state, "
862 "but no thread-state for this thread");
863 /* We must hold the GIL and have our thread state current */
864 /* XXX - remove the check - the assert should be fine,
865 but while this is very new (April 2003), the extra check
866 by release-only users can't hurt.
867 */
868 if (! PyThreadState_IsCurrent(tcur))
869 Py_FatalError("This thread state must be current when releasing");
870 assert(PyThreadState_IsCurrent(tcur));
871 --tcur->gilstate_counter;
872 assert(tcur->gilstate_counter >= 0); /* illegal counter value */
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000873
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000874 /* If we're going to destroy this thread-state, we must
875 * clear it while the GIL is held, as destructors may run.
876 */
877 if (tcur->gilstate_counter == 0) {
878 /* can't have been locked when we created it */
879 assert(oldstate == PyGILState_UNLOCKED);
880 PyThreadState_Clear(tcur);
881 /* Delete the thread-state. Note this releases the GIL too!
882 * It's vital that the GIL be held here, to avoid shutdown
883 * races; see bugs 225673 and 1061968 (that nasty bug has a
884 * habit of coming back).
885 */
886 PyThreadState_DeleteCurrent();
887 }
888 /* Release the lock if necessary */
889 else if (oldstate == PyGILState_UNLOCKED)
890 PyEval_SaveThread();
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000891}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000892
Benjamin Peterson3bf01752012-04-13 18:06:36 -0400893#endif /* WITH_THREAD */
894
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000895#ifdef __cplusplus
896}
897#endif
898
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000899