blob: ba4dd4c2b5f37ca20f8b9c5afb30053b074f2e50 [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;
Martin v. Löwisf0473d52001-07-18 16:17:16 +000093#ifdef HAVE_DLOPEN
Serhiy Storchakac2f7d872016-05-04 09:44:44 +030094#if HAVE_DECL_RTLD_NOW
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000095 interp->dlopenflags = RTLD_NOW;
Martin v. Löwisf0473d52001-07-18 16:17:16 +000096#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000097 interp->dlopenflags = RTLD_LAZY;
Martin v. Löwisf0473d52001-07-18 16:17:16 +000098#endif
99#endif
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000100#ifdef WITH_TSC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000101 interp->tscdump = 0;
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000102#endif
Guido van Rossum25ce5661997-08-02 03:10:38 +0000103
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000104 HEAD_LOCK();
105 interp->next = interp_head;
106 interp_head = interp;
107 HEAD_UNLOCK();
108 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000109
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000110 return interp;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000111}
112
113
114void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000115PyInterpreterState_Clear(PyInterpreterState *interp)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000116{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000117 PyThreadState *p;
118 HEAD_LOCK();
119 for (p = interp->tstate_head; p != NULL; p = p->next)
120 PyThreadState_Clear(p);
121 HEAD_UNLOCK();
122 Py_CLEAR(interp->codec_search_path);
123 Py_CLEAR(interp->codec_search_cache);
124 Py_CLEAR(interp->codec_error_registry);
125 Py_CLEAR(interp->modules);
126 Py_CLEAR(interp->modules_by_index);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000127 Py_CLEAR(interp->sysdict);
128 Py_CLEAR(interp->builtins);
Serhiy Storchaka87a5c512014-02-10 18:21:34 +0200129 Py_CLEAR(interp->builtins_copy);
Brett Cannonfd074152012-04-14 14:10:13 -0400130 Py_CLEAR(interp->importlib);
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;
Yury Selivanov75445082015-05-11 22:57:16 -0400227
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000228 if (init)
229 _PyThreadState_Init(tstate);
Michael W. Hudson188d4362005-06-20 16:52:57 +0000230
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000231 HEAD_LOCK();
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200232 tstate->prev = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000233 tstate->next = interp->tstate_head;
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200234 if (tstate->next)
235 tstate->next->prev = tstate;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000236 interp->tstate_head = tstate;
237 HEAD_UNLOCK();
238 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000239
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000240 return tstate;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000241}
242
Victor Stinner45b9be52010-03-03 23:28:07 +0000243PyThreadState *
244PyThreadState_New(PyInterpreterState *interp)
245{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000246 return new_threadstate(interp, 1);
Victor Stinner45b9be52010-03-03 23:28:07 +0000247}
248
249PyThreadState *
250_PyThreadState_Prealloc(PyInterpreterState *interp)
251{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000252 return new_threadstate(interp, 0);
Victor Stinner45b9be52010-03-03 23:28:07 +0000253}
254
255void
256_PyThreadState_Init(PyThreadState *tstate)
257{
258#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000259 _PyGILState_NoteThreadState(tstate);
Victor Stinner45b9be52010-03-03 23:28:07 +0000260#endif
261}
262
Martin v. Löwis1a214512008-06-11 05:26:20 +0000263PyObject*
Martin v. Löwis7800f752012-06-22 12:20:55 +0200264PyState_FindModule(struct PyModuleDef* module)
Martin v. Löwis1a214512008-06-11 05:26:20 +0000265{
Martin v. Löwis7800f752012-06-22 12:20:55 +0200266 Py_ssize_t index = module->m_base.m_index;
Victor Stinnerb02ef712016-01-22 14:09:55 +0100267 PyInterpreterState *state = GET_INTERP_STATE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000268 PyObject *res;
Nick Coghland5cacbb2015-05-23 22:24:10 +1000269 if (module->m_slots) {
270 return NULL;
271 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000272 if (index == 0)
273 return NULL;
274 if (state->modules_by_index == NULL)
275 return NULL;
Antoine Pitrou75506e82012-08-20 19:30:46 +0200276 if (index >= PyList_GET_SIZE(state->modules_by_index))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000277 return NULL;
278 res = PyList_GET_ITEM(state->modules_by_index, index);
279 return res==Py_None ? NULL : res;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000280}
281
282int
283_PyState_AddModule(PyObject* module, struct PyModuleDef* def)
284{
Nick Coghland5cacbb2015-05-23 22:24:10 +1000285 PyInterpreterState *state;
286 if (def->m_slots) {
287 PyErr_SetString(PyExc_SystemError,
288 "PyState_AddModule called on module with slots");
289 return -1;
290 }
Victor Stinnerb02ef712016-01-22 14:09:55 +0100291 state = GET_INTERP_STATE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000292 if (!def)
293 return -1;
294 if (!state->modules_by_index) {
295 state->modules_by_index = PyList_New(0);
296 if (!state->modules_by_index)
297 return -1;
298 }
299 while(PyList_GET_SIZE(state->modules_by_index) <= def->m_base.m_index)
300 if (PyList_Append(state->modules_by_index, Py_None) < 0)
301 return -1;
302 Py_INCREF(module);
303 return PyList_SetItem(state->modules_by_index,
304 def->m_base.m_index, module);
Martin v. Löwis1a214512008-06-11 05:26:20 +0000305}
Guido van Rossuma027efa1997-05-05 20:56:21 +0000306
Martin v. Löwis7800f752012-06-22 12:20:55 +0200307int
308PyState_AddModule(PyObject* module, struct PyModuleDef* def)
309{
310 Py_ssize_t index;
Victor Stinnerb02ef712016-01-22 14:09:55 +0100311 PyInterpreterState *state = GET_INTERP_STATE();
Martin v. Löwis7800f752012-06-22 12:20:55 +0200312 if (!def) {
313 Py_FatalError("PyState_AddModule: Module Definition is NULL");
314 return -1;
315 }
316 index = def->m_base.m_index;
317 if (state->modules_by_index) {
318 if(PyList_GET_SIZE(state->modules_by_index) >= index) {
319 if(module == PyList_GET_ITEM(state->modules_by_index, index)) {
320 Py_FatalError("PyState_AddModule: Module already added!");
321 return -1;
322 }
323 }
324 }
325 return _PyState_AddModule(module, def);
326}
327
328int
329PyState_RemoveModule(struct PyModuleDef* def)
330{
Nick Coghland5cacbb2015-05-23 22:24:10 +1000331 PyInterpreterState *state;
Martin v. Löwis7800f752012-06-22 12:20:55 +0200332 Py_ssize_t index = def->m_base.m_index;
Nick Coghland5cacbb2015-05-23 22:24:10 +1000333 if (def->m_slots) {
334 PyErr_SetString(PyExc_SystemError,
335 "PyState_RemoveModule called on module with slots");
336 return -1;
337 }
Victor Stinnerb02ef712016-01-22 14:09:55 +0100338 state = GET_INTERP_STATE();
Martin v. Löwis7800f752012-06-22 12:20:55 +0200339 if (index == 0) {
340 Py_FatalError("PyState_RemoveModule: Module index invalid.");
341 return -1;
342 }
343 if (state->modules_by_index == NULL) {
344 Py_FatalError("PyState_RemoveModule: Interpreters module-list not acessible.");
345 return -1;
346 }
347 if (index > PyList_GET_SIZE(state->modules_by_index)) {
348 Py_FatalError("PyState_RemoveModule: Module index out of bounds.");
349 return -1;
350 }
351 return PyList_SetItem(state->modules_by_index, index, Py_None);
352}
353
Antoine Pitrou40322e62013-08-11 00:30:09 +0200354/* used by import.c:PyImport_Cleanup */
355void
356_PyState_ClearModules(void)
357{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100358 PyInterpreterState *state = GET_INTERP_STATE();
Antoine Pitrou40322e62013-08-11 00:30:09 +0200359 if (state->modules_by_index) {
360 Py_ssize_t i;
361 for (i = 0; i < PyList_GET_SIZE(state->modules_by_index); i++) {
362 PyObject *m = PyList_GET_ITEM(state->modules_by_index, i);
363 if (PyModule_Check(m)) {
364 /* cleanup the saved copy of module dicts */
365 PyModuleDef *md = PyModule_GetDef(m);
366 if (md)
367 Py_CLEAR(md->m_base.m_copy);
368 }
369 }
370 /* Setting modules_by_index to NULL could be dangerous, so we
371 clear the list instead. */
372 if (PyList_SetSlice(state->modules_by_index,
373 0, PyList_GET_SIZE(state->modules_by_index),
374 NULL))
375 PyErr_WriteUnraisable(state->modules_by_index);
376 }
377}
378
Guido van Rossuma027efa1997-05-05 20:56:21 +0000379void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000380PyThreadState_Clear(PyThreadState *tstate)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000381{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000382 if (Py_VerboseFlag && tstate->frame != NULL)
383 fprintf(stderr,
384 "PyThreadState_Clear: warning: thread still has a frame\n");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000385
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000386 Py_CLEAR(tstate->frame);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000387
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000388 Py_CLEAR(tstate->dict);
389 Py_CLEAR(tstate->async_exc);
Guido van Rossumede04391998-04-10 20:18:25 +0000390
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000391 Py_CLEAR(tstate->curexc_type);
392 Py_CLEAR(tstate->curexc_value);
393 Py_CLEAR(tstate->curexc_traceback);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000394
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000395 Py_CLEAR(tstate->exc_type);
396 Py_CLEAR(tstate->exc_value);
397 Py_CLEAR(tstate->exc_traceback);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000398
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000399 tstate->c_profilefunc = NULL;
400 tstate->c_tracefunc = NULL;
401 Py_CLEAR(tstate->c_profileobj);
402 Py_CLEAR(tstate->c_traceobj);
Yury Selivanov75445082015-05-11 22:57:16 -0400403
404 Py_CLEAR(tstate->coroutine_wrapper);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000405}
406
407
Guido van Rossum29757862001-01-23 01:46:06 +0000408/* Common code for PyThreadState_Delete() and PyThreadState_DeleteCurrent() */
409static void
410tstate_delete_common(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000411{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000412 PyInterpreterState *interp;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000413 if (tstate == NULL)
414 Py_FatalError("PyThreadState_Delete: NULL tstate");
415 interp = tstate->interp;
416 if (interp == NULL)
417 Py_FatalError("PyThreadState_Delete: NULL interp");
418 HEAD_LOCK();
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200419 if (tstate->prev)
420 tstate->prev->next = tstate->next;
421 else
422 interp->tstate_head = tstate->next;
423 if (tstate->next)
424 tstate->next->prev = tstate->prev;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000425 HEAD_UNLOCK();
Antoine Pitrou7b476992013-09-07 23:38:37 +0200426 if (tstate->on_delete != NULL) {
427 tstate->on_delete(tstate->on_delete_data);
428 }
Victor Stinner1a7425f2013-07-07 16:25:15 +0200429 PyMem_RawFree(tstate);
Guido van Rossuma027efa1997-05-05 20:56:21 +0000430}
431
432
Guido van Rossum29757862001-01-23 01:46:06 +0000433void
434PyThreadState_Delete(PyThreadState *tstate)
435{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100436 if (tstate == GET_TSTATE())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000437 Py_FatalError("PyThreadState_Delete: tstate is still current");
Tim Petersf4e69282006-02-27 17:15:31 +0000438#ifdef WITH_THREAD
Antoine Pitrou079ce542010-09-08 12:37:10 +0000439 if (autoInterpreterState && PyThread_get_key_value(autoTLSkey) == tstate)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000440 PyThread_delete_key_value(autoTLSkey);
Tim Petersf4e69282006-02-27 17:15:31 +0000441#endif /* WITH_THREAD */
Christian Heimesb9dbc7d2013-07-01 23:42:28 +0200442 tstate_delete_common(tstate);
Guido van Rossum29757862001-01-23 01:46:06 +0000443}
444
445
446#ifdef WITH_THREAD
447void
448PyThreadState_DeleteCurrent()
449{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100450 PyThreadState *tstate = GET_TSTATE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000451 if (tstate == NULL)
452 Py_FatalError(
453 "PyThreadState_DeleteCurrent: no current tstate");
Victor Stinner8a1be612016-03-14 22:07:55 +0100454 tstate_delete_common(tstate);
Antoine Pitrou079ce542010-09-08 12:37:10 +0000455 if (autoInterpreterState && PyThread_get_key_value(autoTLSkey) == tstate)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000456 PyThread_delete_key_value(autoTLSkey);
Victor Stinner8a1be612016-03-14 22:07:55 +0100457 SET_TSTATE(NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000458 PyEval_ReleaseLock();
Guido van Rossum29757862001-01-23 01:46:06 +0000459}
460#endif /* WITH_THREAD */
461
462
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200463/*
464 * Delete all thread states except the one passed as argument.
465 * Note that, if there is a current thread state, it *must* be the one
466 * passed as argument. Also, this won't touch any other interpreters
467 * than the current one, since we don't know which thread state should
468 * be kept in those other interpreteres.
469 */
470void
471_PyThreadState_DeleteExcept(PyThreadState *tstate)
472{
473 PyInterpreterState *interp = tstate->interp;
474 PyThreadState *p, *next, *garbage;
475 HEAD_LOCK();
476 /* Remove all thread states, except tstate, from the linked list of
477 thread states. This will allow calling PyThreadState_Clear()
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200478 without holding the lock. */
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200479 garbage = interp->tstate_head;
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200480 if (garbage == tstate)
481 garbage = tstate->next;
482 if (tstate->prev)
483 tstate->prev->next = tstate->next;
484 if (tstate->next)
485 tstate->next->prev = tstate->prev;
486 tstate->prev = tstate->next = NULL;
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200487 interp->tstate_head = tstate;
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200488 HEAD_UNLOCK();
489 /* Clear and deallocate all stale thread states. Even if this
490 executes Python code, we should be safe since it executes
491 in the current thread, not one of the stale threads. */
492 for (p = garbage; p; p = next) {
493 next = p->next;
494 PyThreadState_Clear(p);
Victor Stinner1a7425f2013-07-07 16:25:15 +0200495 PyMem_RawFree(p);
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200496 }
497}
498
499
Guido van Rossuma027efa1997-05-05 20:56:21 +0000500PyThreadState *
Victor Stinnerbfd316e2016-01-20 11:12:38 +0100501_PyThreadState_UncheckedGet(void)
502{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100503 return GET_TSTATE();
Victor Stinnerbfd316e2016-01-20 11:12:38 +0100504}
505
506
507PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000508PyThreadState_Get(void)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000509{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100510 PyThreadState *tstate = GET_TSTATE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000511 if (tstate == NULL)
512 Py_FatalError("PyThreadState_Get: no current thread");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000513
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000514 return tstate;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000515}
516
517
518PyThreadState *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000519PyThreadState_Swap(PyThreadState *newts)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000520{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100521 PyThreadState *oldts = GET_TSTATE();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000522
Victor Stinnerb02ef712016-01-22 14:09:55 +0100523 SET_TSTATE(newts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000524 /* It should not be possible for more than one thread state
525 to be used for a thread. Check this the best we can in debug
526 builds.
527 */
Martin v. Löwis9e296252003-05-01 05:25:29 +0000528#if defined(Py_DEBUG) && defined(WITH_THREAD)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000529 if (newts) {
530 /* This can be called from PyEval_RestoreThread(). Similar
531 to it, we need to ensure errno doesn't change.
532 */
533 int err = errno;
534 PyThreadState *check = PyGILState_GetThisThreadState();
535 if (check && check->interp == newts->interp && check != newts)
536 Py_FatalError("Invalid thread state for this thread");
537 errno = err;
538 }
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000539#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000540 return oldts;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000541}
Guido van Rossumede04391998-04-10 20:18:25 +0000542
543/* An extension mechanism to store arbitrary additional per-thread state.
544 PyThreadState_GetDict() returns a dictionary that can be used to hold such
545 state; the caller should pick a unique key and store its state there. If
Guido van Rossum0fc8f002003-04-15 15:12:39 +0000546 PyThreadState_GetDict() returns NULL, an exception has *not* been raised
547 and the caller should assume no per-thread state is available. */
Guido van Rossumede04391998-04-10 20:18:25 +0000548
549PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000550PyThreadState_GetDict(void)
Guido van Rossumede04391998-04-10 20:18:25 +0000551{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100552 PyThreadState *tstate = GET_TSTATE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000553 if (tstate == NULL)
554 return NULL;
Guido van Rossumede04391998-04-10 20:18:25 +0000555
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000556 if (tstate->dict == NULL) {
557 PyObject *d;
558 tstate->dict = d = PyDict_New();
559 if (d == NULL)
560 PyErr_Clear();
561 }
562 return tstate->dict;
Guido van Rossumede04391998-04-10 20:18:25 +0000563}
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000564
565
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000566/* Asynchronously raise an exception in a thread.
567 Requested by Just van Rossum and Alex Martelli.
Guido van Rossum0f1f63c2005-02-08 02:07:57 +0000568 To prevent naive misuse, you must write your own extension
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000569 to call this, or use ctypes. Must be called with the GIL held.
570 Returns the number of tstates modified (normally 1, but 0 if `id` didn't
571 match any known thread id). Can be called with exc=NULL to clear an
572 existing async exception. This raises no exceptions. */
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000573
574int
575PyThreadState_SetAsyncExc(long id, PyObject *exc) {
Victor Stinnerb02ef712016-01-22 14:09:55 +0100576 PyInterpreterState *interp = GET_INTERP_STATE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000577 PyThreadState *p;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000578
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000579 /* Although the GIL is held, a few C API functions can be called
580 * without the GIL held, and in particular some that create and
581 * destroy thread and interpreter states. Those can mutate the
582 * list of thread states we're traversing, so to prevent that we lock
583 * head_mutex for the duration.
584 */
585 HEAD_LOCK();
586 for (p = interp->tstate_head; p != NULL; p = p->next) {
587 if (p->thread_id == id) {
588 /* Tricky: we need to decref the current value
589 * (if any) in p->async_exc, but that can in turn
590 * allow arbitrary Python code to run, including
591 * perhaps calls to this function. To prevent
592 * deadlock, we need to release head_mutex before
593 * the decref.
594 */
595 PyObject *old_exc = p->async_exc;
596 Py_XINCREF(exc);
597 p->async_exc = exc;
598 HEAD_UNLOCK();
599 Py_XDECREF(old_exc);
600 _PyEval_SignalAsyncExc();
601 return 1;
602 }
603 }
604 HEAD_UNLOCK();
605 return 0;
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000606}
607
608
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000609/* Routines for advanced debuggers, requested by David Beazley.
610 Don't use unless you know what you are doing! */
611
612PyInterpreterState *
613PyInterpreterState_Head(void)
614{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000615 return interp_head;
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000616}
617
618PyInterpreterState *
619PyInterpreterState_Next(PyInterpreterState *interp) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000620 return interp->next;
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000621}
622
623PyThreadState *
624PyInterpreterState_ThreadHead(PyInterpreterState *interp) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000625 return interp->tstate_head;
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000626}
627
628PyThreadState *
629PyThreadState_Next(PyThreadState *tstate) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000630 return tstate->next;
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000631}
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000632
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000633/* The implementation of sys._current_frames(). This is intended to be
634 called with the GIL held, as it will be when called via
635 sys._current_frames(). It's possible it would work fine even without
636 the GIL held, but haven't thought enough about that.
637*/
638PyObject *
639_PyThread_CurrentFrames(void)
640{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000641 PyObject *result;
642 PyInterpreterState *i;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000643
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000644 result = PyDict_New();
645 if (result == NULL)
646 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000647
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000648 /* for i in all interpreters:
649 * for t in all of i's thread states:
650 * if t's frame isn't NULL, map t's id to its frame
Ezio Melotti13925002011-03-16 11:05:33 +0200651 * Because these lists can mutate even when the GIL is held, we
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000652 * need to grab head_mutex for the duration.
653 */
654 HEAD_LOCK();
655 for (i = interp_head; i != NULL; i = i->next) {
656 PyThreadState *t;
657 for (t = i->tstate_head; t != NULL; t = t->next) {
658 PyObject *id;
659 int stat;
660 struct _frame *frame = t->frame;
661 if (frame == NULL)
662 continue;
663 id = PyLong_FromLong(t->thread_id);
664 if (id == NULL)
665 goto Fail;
666 stat = PyDict_SetItem(result, id, (PyObject *)frame);
667 Py_DECREF(id);
668 if (stat < 0)
669 goto Fail;
670 }
671 }
672 HEAD_UNLOCK();
673 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000674
675 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000676 HEAD_UNLOCK();
677 Py_DECREF(result);
678 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000679}
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000680
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000681/* Python "auto thread state" API. */
682#ifdef WITH_THREAD
683
684/* Keep this as a static, as it is not reliable! It can only
685 ever be compared to the state for the *current* thread.
686 * If not equal, then it doesn't matter that the actual
687 value may change immediately after comparison, as it can't
688 possibly change to the current thread's state.
689 * If equal, then the current thread holds the lock, so the value can't
690 change until we yield the lock.
691*/
692static int
693PyThreadState_IsCurrent(PyThreadState *tstate)
694{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000695 /* Must be the tstate for this thread */
696 assert(PyGILState_GetThisThreadState()==tstate);
Victor Stinnerb02ef712016-01-22 14:09:55 +0100697 return tstate == GET_TSTATE();
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000698}
699
Tim Peters4c1f5ec2004-10-09 17:25:05 +0000700/* Internal initialization/finalization functions called by
Martin Panterb4ce1fc2015-11-30 03:18:29 +0000701 Py_Initialize/Py_FinalizeEx
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000702*/
Tim Peters19717fa2004-10-09 17:38:29 +0000703void
704_PyGILState_Init(PyInterpreterState *i, PyThreadState *t)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000705{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000706 assert(i && t); /* must init with valid states */
707 autoTLSkey = PyThread_create_key();
Kristján Valur Jónsson2fea9b92010-09-20 02:11:49 +0000708 if (autoTLSkey == -1)
709 Py_FatalError("Could not allocate TLS entry");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000710 autoInterpreterState = i;
711 assert(PyThread_get_key_value(autoTLSkey) == NULL);
712 assert(t->gilstate_counter == 0);
Michael W. Hudson188d4362005-06-20 16:52:57 +0000713
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000714 _PyGILState_NoteThreadState(t);
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000715}
716
Victor Stinner861d9ab2016-03-16 22:45:24 +0100717PyInterpreterState *
718_PyGILState_GetInterpreterStateUnsafe(void)
719{
720 return autoInterpreterState;
721}
722
Tim Peters19717fa2004-10-09 17:38:29 +0000723void
724_PyGILState_Fini(void)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000725{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000726 PyThread_delete_key(autoTLSkey);
Victor Stinner8a1be612016-03-14 22:07:55 +0100727 autoTLSkey = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000728 autoInterpreterState = NULL;
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000729}
730
Charles-François Natalia233df82011-11-22 19:49:51 +0100731/* Reset the TLS key - called by PyOS_AfterFork().
Antoine Pitrou0c759fe2011-04-27 19:28:05 +0200732 * This should not be necessary, but some - buggy - pthread implementations
Charles-François Natalia233df82011-11-22 19:49:51 +0100733 * don't reset TLS upon fork(), see issue #10517.
Antoine Pitrou0c759fe2011-04-27 19:28:05 +0200734 */
735void
736_PyGILState_Reinit(void)
737{
738 PyThreadState *tstate = PyGILState_GetThisThreadState();
739 PyThread_delete_key(autoTLSkey);
740 if ((autoTLSkey = PyThread_create_key()) == -1)
741 Py_FatalError("Could not allocate TLS entry");
742
Charles-François Natalia233df82011-11-22 19:49:51 +0100743 /* If the thread had an associated auto thread state, reassociate it with
744 * the new key. */
745 if (tstate && PyThread_set_key_value(autoTLSkey, (void *)tstate) < 0)
Antoine Pitrou0c759fe2011-04-27 19:28:05 +0200746 Py_FatalError("Couldn't create autoTLSkey mapping");
747}
748
Michael W. Hudson188d4362005-06-20 16:52:57 +0000749/* When a thread state is created for a thread by some mechanism other than
750 PyGILState_Ensure, it's important that the GILState machinery knows about
751 it so it doesn't try to create another thread state for the thread (this is
752 a better fix for SF bug #1010677 than the first one attempted).
753*/
Thomas Wouters89f507f2006-12-13 04:49:30 +0000754static void
Michael W. Hudson188d4362005-06-20 16:52:57 +0000755_PyGILState_NoteThreadState(PyThreadState* tstate)
756{
Antoine Pitrou079ce542010-09-08 12:37:10 +0000757 /* If autoTLSkey isn't initialized, this must be the very first
758 threadstate created in Py_Initialize(). Don't do anything for now
759 (we'll be back here when _PyGILState_Init is called). */
760 if (!autoInterpreterState)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000761 return;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000762
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000763 /* Stick the thread state for this thread in thread local storage.
Michael W. Hudson188d4362005-06-20 16:52:57 +0000764
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000765 The only situation where you can legitimately have more than one
766 thread state for an OS level thread is when there are multiple
Victor Stinner590cebe2013-12-13 11:08:56 +0100767 interpreters.
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000768
Victor Stinner590cebe2013-12-13 11:08:56 +0100769 You shouldn't really be using the PyGILState_ APIs anyway (see issues
770 #10915 and #15751).
Michael W. Hudson188d4362005-06-20 16:52:57 +0000771
Victor Stinner590cebe2013-12-13 11:08:56 +0100772 The first thread state created for that given OS level thread will
773 "win", which seems reasonable behaviour.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000774 */
Victor Stinner590cebe2013-12-13 11:08:56 +0100775 if (PyThread_get_key_value(autoTLSkey) == NULL) {
776 if (PyThread_set_key_value(autoTLSkey, (void *)tstate) < 0)
777 Py_FatalError("Couldn't create autoTLSkey mapping");
778 }
Michael W. Hudson188d4362005-06-20 16:52:57 +0000779
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000780 /* PyGILState_Release must not try to delete this thread state. */
781 tstate->gilstate_counter = 1;
Michael W. Hudson188d4362005-06-20 16:52:57 +0000782}
783
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000784/* The public functions */
Tim Peters19717fa2004-10-09 17:38:29 +0000785PyThreadState *
786PyGILState_GetThisThreadState(void)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000787{
Antoine Pitrou079ce542010-09-08 12:37:10 +0000788 if (autoInterpreterState == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000789 return NULL;
790 return (PyThreadState *)PyThread_get_key_value(autoTLSkey);
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000791}
792
Kristján Valur Jónsson684cd0e2013-03-23 03:36:16 -0700793int
794PyGILState_Check(void)
795{
Victor Stinner8a1be612016-03-14 22:07:55 +0100796 PyThreadState *tstate;
797
798 if (!_PyGILState_check_enabled)
799 return 1;
800
801 if (autoTLSkey == -1)
802 return 1;
803
804 tstate = GET_TSTATE();
805 if (tstate == NULL)
806 return 0;
807
808 return (tstate == PyGILState_GetThisThreadState());
Kristján Valur Jónsson684cd0e2013-03-23 03:36:16 -0700809}
810
Tim Peters19717fa2004-10-09 17:38:29 +0000811PyGILState_STATE
812PyGILState_Ensure(void)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000813{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000814 int current;
815 PyThreadState *tcur;
816 /* Note that we do not auto-init Python here - apart from
817 potential races with 2 threads auto-initializing, pep-311
818 spells out other issues. Embedders are expected to have
819 called Py_Initialize() and usually PyEval_InitThreads().
820 */
821 assert(autoInterpreterState); /* Py_Initialize() hasn't been called! */
822 tcur = (PyThreadState *)PyThread_get_key_value(autoTLSkey);
823 if (tcur == NULL) {
Victor Stinner62ca1002013-12-13 01:46:43 +0100824 /* At startup, Python has no concrete GIL. If PyGILState_Ensure() is
825 called from a new thread for the first time, we need the create the
826 GIL. */
827 PyEval_InitThreads();
828
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000829 /* Create a new thread state for this thread */
830 tcur = PyThreadState_New(autoInterpreterState);
831 if (tcur == NULL)
832 Py_FatalError("Couldn't create thread-state for new thread");
833 /* This is our thread state! We'll need to delete it in the
834 matching call to PyGILState_Release(). */
835 tcur->gilstate_counter = 0;
836 current = 0; /* new thread state is never current */
837 }
838 else
839 current = PyThreadState_IsCurrent(tcur);
840 if (current == 0)
841 PyEval_RestoreThread(tcur);
842 /* Update our counter in the thread-state - no need for locks:
843 - tcur will remain valid as we hold the GIL.
844 - the counter is safe as we are the only thread "allowed"
845 to modify this value
846 */
847 ++tcur->gilstate_counter;
848 return current ? PyGILState_LOCKED : PyGILState_UNLOCKED;
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000849}
850
Tim Peters19717fa2004-10-09 17:38:29 +0000851void
852PyGILState_Release(PyGILState_STATE oldstate)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000853{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000854 PyThreadState *tcur = (PyThreadState *)PyThread_get_key_value(
855 autoTLSkey);
856 if (tcur == NULL)
857 Py_FatalError("auto-releasing thread-state, "
858 "but no thread-state for this thread");
859 /* We must hold the GIL and have our thread state current */
860 /* XXX - remove the check - the assert should be fine,
861 but while this is very new (April 2003), the extra check
862 by release-only users can't hurt.
863 */
864 if (! PyThreadState_IsCurrent(tcur))
865 Py_FatalError("This thread state must be current when releasing");
866 assert(PyThreadState_IsCurrent(tcur));
867 --tcur->gilstate_counter;
868 assert(tcur->gilstate_counter >= 0); /* illegal counter value */
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000869
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000870 /* If we're going to destroy this thread-state, we must
871 * clear it while the GIL is held, as destructors may run.
872 */
873 if (tcur->gilstate_counter == 0) {
874 /* can't have been locked when we created it */
875 assert(oldstate == PyGILState_UNLOCKED);
876 PyThreadState_Clear(tcur);
877 /* Delete the thread-state. Note this releases the GIL too!
878 * It's vital that the GIL be held here, to avoid shutdown
879 * races; see bugs 225673 and 1061968 (that nasty bug has a
880 * habit of coming back).
881 */
882 PyThreadState_DeleteCurrent();
883 }
884 /* Release the lock if necessary */
885 else if (oldstate == PyGILState_UNLOCKED)
886 PyEval_SaveThread();
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000887}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000888
Benjamin Peterson3bf01752012-04-13 18:06:36 -0400889#endif /* WITH_THREAD */
890
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000891#ifdef __cplusplus
892}
893#endif
894
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000895