• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 /* Thread and interpreter state structures and their interfaces */
3 
4 #include "Python.h"
5 
6 #define GET_TSTATE() \
7     ((PyThreadState*)_Py_atomic_load_relaxed(&_PyThreadState_Current))
8 #define SET_TSTATE(value) \
9     _Py_atomic_store_relaxed(&_PyThreadState_Current, (uintptr_t)(value))
10 #define GET_INTERP_STATE() \
11     (GET_TSTATE()->interp)
12 
13 
14 /* --------------------------------------------------------------------------
15 CAUTION
16 
17 Always use PyMem_RawMalloc() and PyMem_RawFree() directly in this file.  A
18 number of these functions are advertised as safe to call when the GIL isn't
19 held, and in a debug build Python redirects (e.g.) PyMem_NEW (etc) to Python's
20 debugging obmalloc functions.  Those aren't thread-safe (they rely on the GIL
21 to avoid the expense of doing their own locking).
22 -------------------------------------------------------------------------- */
23 
24 #ifdef HAVE_DLOPEN
25 #ifdef HAVE_DLFCN_H
26 #include <dlfcn.h>
27 #endif
28 #if !HAVE_DECL_RTLD_LAZY
29 #define RTLD_LAZY 1
30 #endif
31 #endif
32 
33 #ifdef __cplusplus
34 extern "C" {
35 #endif
36 
37 int _PyGILState_check_enabled = 1;
38 
39 #ifdef WITH_THREAD
40 #include "pythread.h"
41 static PyThread_type_lock head_mutex = NULL; /* Protects interp->tstate_head */
42 #define HEAD_INIT() (void)(head_mutex || (head_mutex = PyThread_allocate_lock()))
43 #define HEAD_LOCK() PyThread_acquire_lock(head_mutex, WAIT_LOCK)
44 #define HEAD_UNLOCK() PyThread_release_lock(head_mutex)
45 
46 /* The single PyInterpreterState used by this process'
47    GILState implementation
48 */
49 static PyInterpreterState *autoInterpreterState = NULL;
50 static int autoTLSkey = -1;
51 #else
52 #define HEAD_INIT() /* Nothing */
53 #define HEAD_LOCK() /* Nothing */
54 #define HEAD_UNLOCK() /* Nothing */
55 #endif
56 
57 static PyInterpreterState *interp_head = NULL;
58 
59 /* Assuming the current thread holds the GIL, this is the
60    PyThreadState for the current thread. */
61 _Py_atomic_address _PyThreadState_Current = {0};
62 PyThreadFrameGetter _PyThreadState_GetFrame = NULL;
63 
64 #ifdef WITH_THREAD
65 static void _PyGILState_NoteThreadState(PyThreadState* tstate);
66 #endif
67 
68 
69 PyInterpreterState *
PyInterpreterState_New(void)70 PyInterpreterState_New(void)
71 {
72     PyInterpreterState *interp = (PyInterpreterState *)
73                                  PyMem_RawMalloc(sizeof(PyInterpreterState));
74 
75     if (interp != NULL) {
76         HEAD_INIT();
77 #ifdef WITH_THREAD
78         if (head_mutex == NULL)
79             Py_FatalError("Can't initialize threads for interpreter");
80 #endif
81         interp->modules = NULL;
82         interp->modules_by_index = NULL;
83         interp->sysdict = NULL;
84         interp->builtins = NULL;
85         interp->builtins_copy = NULL;
86         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;
91         interp->fscodec_initialized = 0;
92         interp->importlib = NULL;
93         interp->import_func = NULL;
94         interp->eval_frame = _PyEval_EvalFrameDefault;
95 #ifdef HAVE_DLOPEN
96 #if HAVE_DECL_RTLD_NOW
97         interp->dlopenflags = RTLD_NOW;
98 #else
99         interp->dlopenflags = RTLD_LAZY;
100 #endif
101 #endif
102 
103         HEAD_LOCK();
104         interp->next = interp_head;
105         interp_head = interp;
106         HEAD_UNLOCK();
107     }
108 
109     return interp;
110 }
111 
112 
113 void
PyInterpreterState_Clear(PyInterpreterState * interp)114 PyInterpreterState_Clear(PyInterpreterState *interp)
115 {
116     PyThreadState *p;
117     HEAD_LOCK();
118     for (p = interp->tstate_head; p != NULL; p = p->next)
119         PyThreadState_Clear(p);
120     HEAD_UNLOCK();
121     Py_CLEAR(interp->codec_search_path);
122     Py_CLEAR(interp->codec_search_cache);
123     Py_CLEAR(interp->codec_error_registry);
124     Py_CLEAR(interp->modules);
125     Py_CLEAR(interp->modules_by_index);
126     Py_CLEAR(interp->sysdict);
127     Py_CLEAR(interp->builtins);
128     Py_CLEAR(interp->builtins_copy);
129     Py_CLEAR(interp->importlib);
130     Py_CLEAR(interp->import_func);
131 }
132 
133 
134 static void
zapthreads(PyInterpreterState * interp)135 zapthreads(PyInterpreterState *interp)
136 {
137     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     }
143 }
144 
145 
146 void
PyInterpreterState_Delete(PyInterpreterState * interp)147 PyInterpreterState_Delete(PyInterpreterState *interp)
148 {
149     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();
163     PyMem_RawFree(interp);
164 #ifdef WITH_THREAD
165     if (interp_head == NULL && head_mutex != NULL) {
166         PyThread_free_lock(head_mutex);
167         head_mutex = NULL;
168     }
169 #endif
170 }
171 
172 
173 /* Default implementation for _PyThreadState_GetFrame */
174 static struct _frame *
threadstate_getframe(PyThreadState * self)175 threadstate_getframe(PyThreadState *self)
176 {
177     return self->frame;
178 }
179 
180 static PyThreadState *
new_threadstate(PyInterpreterState * interp,int init)181 new_threadstate(PyInterpreterState *interp, int init)
182 {
183     PyThreadState *tstate = (PyThreadState *)PyMem_RawMalloc(sizeof(PyThreadState));
184 
185     if (_PyThreadState_GetFrame == NULL)
186         _PyThreadState_GetFrame = threadstate_getframe;
187 
188     if (tstate != NULL) {
189         tstate->interp = interp;
190 
191         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;
197         tstate->gilstate_counter = 0;
198         tstate->async_exc = NULL;
199 #ifdef WITH_THREAD
200         tstate->thread_id = PyThread_get_thread_ident();
201 #else
202         tstate->thread_id = 0;
203 #endif
204 
205         tstate->dict = NULL;
206 
207         tstate->curexc_type = NULL;
208         tstate->curexc_value = NULL;
209         tstate->curexc_traceback = NULL;
210 
211         tstate->exc_type = NULL;
212         tstate->exc_value = NULL;
213         tstate->exc_traceback = NULL;
214 
215         tstate->c_profilefunc = NULL;
216         tstate->c_tracefunc = NULL;
217         tstate->c_profileobj = NULL;
218         tstate->c_traceobj = NULL;
219 
220         tstate->trash_delete_nesting = 0;
221         tstate->trash_delete_later = NULL;
222         tstate->on_delete = NULL;
223         tstate->on_delete_data = NULL;
224 
225         tstate->coroutine_wrapper = NULL;
226         tstate->in_coroutine_wrapper = 0;
227         tstate->co_extra_user_count = 0;
228 
229         tstate->async_gen_firstiter = NULL;
230         tstate->async_gen_finalizer = NULL;
231 
232         if (init)
233             _PyThreadState_Init(tstate);
234 
235         HEAD_LOCK();
236         tstate->prev = NULL;
237         tstate->next = interp->tstate_head;
238         if (tstate->next)
239             tstate->next->prev = tstate;
240         interp->tstate_head = tstate;
241         HEAD_UNLOCK();
242     }
243 
244     return tstate;
245 }
246 
247 PyThreadState *
PyThreadState_New(PyInterpreterState * interp)248 PyThreadState_New(PyInterpreterState *interp)
249 {
250     return new_threadstate(interp, 1);
251 }
252 
253 PyThreadState *
_PyThreadState_Prealloc(PyInterpreterState * interp)254 _PyThreadState_Prealloc(PyInterpreterState *interp)
255 {
256     return new_threadstate(interp, 0);
257 }
258 
259 void
_PyThreadState_Init(PyThreadState * tstate)260 _PyThreadState_Init(PyThreadState *tstate)
261 {
262 #ifdef WITH_THREAD
263     _PyGILState_NoteThreadState(tstate);
264 #endif
265 }
266 
267 PyObject*
PyState_FindModule(struct PyModuleDef * module)268 PyState_FindModule(struct PyModuleDef* module)
269 {
270     Py_ssize_t index = module->m_base.m_index;
271     PyInterpreterState *state = GET_INTERP_STATE();
272     PyObject *res;
273     if (module->m_slots) {
274         return NULL;
275     }
276     if (index == 0)
277         return NULL;
278     if (state->modules_by_index == NULL)
279         return NULL;
280     if (index >= PyList_GET_SIZE(state->modules_by_index))
281         return NULL;
282     res = PyList_GET_ITEM(state->modules_by_index, index);
283     return res==Py_None ? NULL : res;
284 }
285 
286 int
_PyState_AddModule(PyObject * module,struct PyModuleDef * def)287 _PyState_AddModule(PyObject* module, struct PyModuleDef* def)
288 {
289     PyInterpreterState *state;
290     if (!def) {
291         assert(PyErr_Occurred());
292         return -1;
293     }
294     if (def->m_slots) {
295         PyErr_SetString(PyExc_SystemError,
296                         "PyState_AddModule called on module with slots");
297         return -1;
298     }
299     state = GET_INTERP_STATE();
300     if (!state->modules_by_index) {
301         state->modules_by_index = PyList_New(0);
302         if (!state->modules_by_index)
303             return -1;
304     }
305     while(PyList_GET_SIZE(state->modules_by_index) <= def->m_base.m_index)
306         if (PyList_Append(state->modules_by_index, Py_None) < 0)
307             return -1;
308     Py_INCREF(module);
309     return PyList_SetItem(state->modules_by_index,
310                           def->m_base.m_index, module);
311 }
312 
313 int
PyState_AddModule(PyObject * module,struct PyModuleDef * def)314 PyState_AddModule(PyObject* module, struct PyModuleDef* def)
315 {
316     Py_ssize_t index;
317     PyInterpreterState *state = GET_INTERP_STATE();
318     if (!def) {
319         Py_FatalError("PyState_AddModule: Module Definition is NULL");
320         return -1;
321     }
322     index = def->m_base.m_index;
323     if (state->modules_by_index) {
324         if(PyList_GET_SIZE(state->modules_by_index) >= index) {
325             if(module == PyList_GET_ITEM(state->modules_by_index, index)) {
326                 Py_FatalError("PyState_AddModule: Module already added!");
327                 return -1;
328             }
329         }
330     }
331     return _PyState_AddModule(module, def);
332 }
333 
334 int
PyState_RemoveModule(struct PyModuleDef * def)335 PyState_RemoveModule(struct PyModuleDef* def)
336 {
337     PyInterpreterState *state;
338     Py_ssize_t index = def->m_base.m_index;
339     if (def->m_slots) {
340         PyErr_SetString(PyExc_SystemError,
341                         "PyState_RemoveModule called on module with slots");
342         return -1;
343     }
344     state = GET_INTERP_STATE();
345     if (index == 0) {
346         Py_FatalError("PyState_RemoveModule: Module index invalid.");
347         return -1;
348     }
349     if (state->modules_by_index == NULL) {
350         Py_FatalError("PyState_RemoveModule: Interpreters module-list not acessible.");
351         return -1;
352     }
353     if (index > PyList_GET_SIZE(state->modules_by_index)) {
354         Py_FatalError("PyState_RemoveModule: Module index out of bounds.");
355         return -1;
356     }
357     return PyList_SetItem(state->modules_by_index, index, Py_None);
358 }
359 
360 /* used by import.c:PyImport_Cleanup */
361 void
_PyState_ClearModules(void)362 _PyState_ClearModules(void)
363 {
364     PyInterpreterState *state = GET_INTERP_STATE();
365     if (state->modules_by_index) {
366         Py_ssize_t i;
367         for (i = 0; i < PyList_GET_SIZE(state->modules_by_index); i++) {
368             PyObject *m = PyList_GET_ITEM(state->modules_by_index, i);
369             if (PyModule_Check(m)) {
370                 /* cleanup the saved copy of module dicts */
371                 PyModuleDef *md = PyModule_GetDef(m);
372                 if (md)
373                     Py_CLEAR(md->m_base.m_copy);
374             }
375         }
376         /* Setting modules_by_index to NULL could be dangerous, so we
377            clear the list instead. */
378         if (PyList_SetSlice(state->modules_by_index,
379                             0, PyList_GET_SIZE(state->modules_by_index),
380                             NULL))
381             PyErr_WriteUnraisable(state->modules_by_index);
382     }
383 }
384 
385 void
PyThreadState_Clear(PyThreadState * tstate)386 PyThreadState_Clear(PyThreadState *tstate)
387 {
388     if (Py_VerboseFlag && tstate->frame != NULL)
389         fprintf(stderr,
390           "PyThreadState_Clear: warning: thread still has a frame\n");
391 
392     Py_CLEAR(tstate->frame);
393 
394     Py_CLEAR(tstate->dict);
395     Py_CLEAR(tstate->async_exc);
396 
397     Py_CLEAR(tstate->curexc_type);
398     Py_CLEAR(tstate->curexc_value);
399     Py_CLEAR(tstate->curexc_traceback);
400 
401     Py_CLEAR(tstate->exc_type);
402     Py_CLEAR(tstate->exc_value);
403     Py_CLEAR(tstate->exc_traceback);
404 
405     tstate->c_profilefunc = NULL;
406     tstate->c_tracefunc = NULL;
407     Py_CLEAR(tstate->c_profileobj);
408     Py_CLEAR(tstate->c_traceobj);
409 
410     Py_CLEAR(tstate->coroutine_wrapper);
411     Py_CLEAR(tstate->async_gen_firstiter);
412     Py_CLEAR(tstate->async_gen_finalizer);
413 }
414 
415 
416 /* Common code for PyThreadState_Delete() and PyThreadState_DeleteCurrent() */
417 static void
tstate_delete_common(PyThreadState * tstate)418 tstate_delete_common(PyThreadState *tstate)
419 {
420     PyInterpreterState *interp;
421     if (tstate == NULL)
422         Py_FatalError("PyThreadState_Delete: NULL tstate");
423     interp = tstate->interp;
424     if (interp == NULL)
425         Py_FatalError("PyThreadState_Delete: NULL interp");
426     HEAD_LOCK();
427     if (tstate->prev)
428         tstate->prev->next = tstate->next;
429     else
430         interp->tstate_head = tstate->next;
431     if (tstate->next)
432         tstate->next->prev = tstate->prev;
433     HEAD_UNLOCK();
434     if (tstate->on_delete != NULL) {
435         tstate->on_delete(tstate->on_delete_data);
436     }
437     PyMem_RawFree(tstate);
438 }
439 
440 
441 void
PyThreadState_Delete(PyThreadState * tstate)442 PyThreadState_Delete(PyThreadState *tstate)
443 {
444     if (tstate == GET_TSTATE())
445         Py_FatalError("PyThreadState_Delete: tstate is still current");
446 #ifdef WITH_THREAD
447     if (autoInterpreterState && PyThread_get_key_value(autoTLSkey) == tstate)
448         PyThread_delete_key_value(autoTLSkey);
449 #endif /* WITH_THREAD */
450     tstate_delete_common(tstate);
451 }
452 
453 
454 #ifdef WITH_THREAD
455 void
PyThreadState_DeleteCurrent()456 PyThreadState_DeleteCurrent()
457 {
458     PyThreadState *tstate = GET_TSTATE();
459     if (tstate == NULL)
460         Py_FatalError(
461             "PyThreadState_DeleteCurrent: no current tstate");
462     tstate_delete_common(tstate);
463     if (autoInterpreterState && PyThread_get_key_value(autoTLSkey) == tstate)
464         PyThread_delete_key_value(autoTLSkey);
465     SET_TSTATE(NULL);
466     PyEval_ReleaseLock();
467 }
468 #endif /* WITH_THREAD */
469 
470 
471 /*
472  * Delete all thread states except the one passed as argument.
473  * Note that, if there is a current thread state, it *must* be the one
474  * passed as argument.  Also, this won't touch any other interpreters
475  * than the current one, since we don't know which thread state should
476  * be kept in those other interpreteres.
477  */
478 void
_PyThreadState_DeleteExcept(PyThreadState * tstate)479 _PyThreadState_DeleteExcept(PyThreadState *tstate)
480 {
481     PyInterpreterState *interp = tstate->interp;
482     PyThreadState *p, *next, *garbage;
483     HEAD_LOCK();
484     /* Remove all thread states, except tstate, from the linked list of
485        thread states.  This will allow calling PyThreadState_Clear()
486        without holding the lock. */
487     garbage = interp->tstate_head;
488     if (garbage == tstate)
489         garbage = tstate->next;
490     if (tstate->prev)
491         tstate->prev->next = tstate->next;
492     if (tstate->next)
493         tstate->next->prev = tstate->prev;
494     tstate->prev = tstate->next = NULL;
495     interp->tstate_head = tstate;
496     HEAD_UNLOCK();
497     /* Clear and deallocate all stale thread states.  Even if this
498        executes Python code, we should be safe since it executes
499        in the current thread, not one of the stale threads. */
500     for (p = garbage; p; p = next) {
501         next = p->next;
502         PyThreadState_Clear(p);
503         PyMem_RawFree(p);
504     }
505 }
506 
507 
508 PyThreadState *
_PyThreadState_UncheckedGet(void)509 _PyThreadState_UncheckedGet(void)
510 {
511     return GET_TSTATE();
512 }
513 
514 
515 PyThreadState *
PyThreadState_Get(void)516 PyThreadState_Get(void)
517 {
518     PyThreadState *tstate = GET_TSTATE();
519     if (tstate == NULL)
520         Py_FatalError("PyThreadState_Get: no current thread");
521 
522     return tstate;
523 }
524 
525 
526 PyThreadState *
PyThreadState_Swap(PyThreadState * newts)527 PyThreadState_Swap(PyThreadState *newts)
528 {
529     PyThreadState *oldts = GET_TSTATE();
530 
531     SET_TSTATE(newts);
532     /* It should not be possible for more than one thread state
533        to be used for a thread.  Check this the best we can in debug
534        builds.
535     */
536 #if defined(Py_DEBUG) && defined(WITH_THREAD)
537     if (newts) {
538         /* This can be called from PyEval_RestoreThread(). Similar
539            to it, we need to ensure errno doesn't change.
540         */
541         int err = errno;
542         PyThreadState *check = PyGILState_GetThisThreadState();
543         if (check && check->interp == newts->interp && check != newts)
544             Py_FatalError("Invalid thread state for this thread");
545         errno = err;
546     }
547 #endif
548     return oldts;
549 }
550 
551 /* An extension mechanism to store arbitrary additional per-thread state.
552    PyThreadState_GetDict() returns a dictionary that can be used to hold such
553    state; the caller should pick a unique key and store its state there.  If
554    PyThreadState_GetDict() returns NULL, an exception has *not* been raised
555    and the caller should assume no per-thread state is available. */
556 
557 PyObject *
PyThreadState_GetDict(void)558 PyThreadState_GetDict(void)
559 {
560     PyThreadState *tstate = GET_TSTATE();
561     if (tstate == NULL)
562         return NULL;
563 
564     if (tstate->dict == NULL) {
565         PyObject *d;
566         tstate->dict = d = PyDict_New();
567         if (d == NULL)
568             PyErr_Clear();
569     }
570     return tstate->dict;
571 }
572 
573 
574 /* Asynchronously raise an exception in a thread.
575    Requested by Just van Rossum and Alex Martelli.
576    To prevent naive misuse, you must write your own extension
577    to call this, or use ctypes.  Must be called with the GIL held.
578    Returns the number of tstates modified (normally 1, but 0 if `id` didn't
579    match any known thread id).  Can be called with exc=NULL to clear an
580    existing async exception.  This raises no exceptions. */
581 
582 int
PyThreadState_SetAsyncExc(long id,PyObject * exc)583 PyThreadState_SetAsyncExc(long id, PyObject *exc) {
584     PyInterpreterState *interp = GET_INTERP_STATE();
585     PyThreadState *p;
586 
587     /* Although the GIL is held, a few C API functions can be called
588      * without the GIL held, and in particular some that create and
589      * destroy thread and interpreter states.  Those can mutate the
590      * list of thread states we're traversing, so to prevent that we lock
591      * head_mutex for the duration.
592      */
593     HEAD_LOCK();
594     for (p = interp->tstate_head; p != NULL; p = p->next) {
595         if (p->thread_id == id) {
596             /* Tricky:  we need to decref the current value
597              * (if any) in p->async_exc, but that can in turn
598              * allow arbitrary Python code to run, including
599              * perhaps calls to this function.  To prevent
600              * deadlock, we need to release head_mutex before
601              * the decref.
602              */
603             PyObject *old_exc = p->async_exc;
604             Py_XINCREF(exc);
605             p->async_exc = exc;
606             HEAD_UNLOCK();
607             Py_XDECREF(old_exc);
608             _PyEval_SignalAsyncExc();
609             return 1;
610         }
611     }
612     HEAD_UNLOCK();
613     return 0;
614 }
615 
616 
617 /* Routines for advanced debuggers, requested by David Beazley.
618    Don't use unless you know what you are doing! */
619 
620 PyInterpreterState *
PyInterpreterState_Head(void)621 PyInterpreterState_Head(void)
622 {
623     return interp_head;
624 }
625 
626 PyInterpreterState *
PyInterpreterState_Next(PyInterpreterState * interp)627 PyInterpreterState_Next(PyInterpreterState *interp) {
628     return interp->next;
629 }
630 
631 PyThreadState *
PyInterpreterState_ThreadHead(PyInterpreterState * interp)632 PyInterpreterState_ThreadHead(PyInterpreterState *interp) {
633     return interp->tstate_head;
634 }
635 
636 PyThreadState *
PyThreadState_Next(PyThreadState * tstate)637 PyThreadState_Next(PyThreadState *tstate) {
638     return tstate->next;
639 }
640 
641 /* The implementation of sys._current_frames().  This is intended to be
642    called with the GIL held, as it will be when called via
643    sys._current_frames().  It's possible it would work fine even without
644    the GIL held, but haven't thought enough about that.
645 */
646 PyObject *
_PyThread_CurrentFrames(void)647 _PyThread_CurrentFrames(void)
648 {
649     PyObject *result;
650     PyInterpreterState *i;
651 
652     result = PyDict_New();
653     if (result == NULL)
654         return NULL;
655 
656     /* for i in all interpreters:
657      *     for t in all of i's thread states:
658      *          if t's frame isn't NULL, map t's id to its frame
659      * Because these lists can mutate even when the GIL is held, we
660      * need to grab head_mutex for the duration.
661      */
662     HEAD_LOCK();
663     for (i = interp_head; i != NULL; i = i->next) {
664         PyThreadState *t;
665         for (t = i->tstate_head; t != NULL; t = t->next) {
666             PyObject *id;
667             int stat;
668             struct _frame *frame = t->frame;
669             if (frame == NULL)
670                 continue;
671             id = PyLong_FromLong(t->thread_id);
672             if (id == NULL)
673                 goto Fail;
674             stat = PyDict_SetItem(result, id, (PyObject *)frame);
675             Py_DECREF(id);
676             if (stat < 0)
677                 goto Fail;
678         }
679     }
680     HEAD_UNLOCK();
681     return result;
682 
683  Fail:
684     HEAD_UNLOCK();
685     Py_DECREF(result);
686     return NULL;
687 }
688 
689 /* Python "auto thread state" API. */
690 #ifdef WITH_THREAD
691 
692 /* Keep this as a static, as it is not reliable!  It can only
693    ever be compared to the state for the *current* thread.
694    * If not equal, then it doesn't matter that the actual
695      value may change immediately after comparison, as it can't
696      possibly change to the current thread's state.
697    * If equal, then the current thread holds the lock, so the value can't
698      change until we yield the lock.
699 */
700 static int
PyThreadState_IsCurrent(PyThreadState * tstate)701 PyThreadState_IsCurrent(PyThreadState *tstate)
702 {
703     /* Must be the tstate for this thread */
704     assert(PyGILState_GetThisThreadState()==tstate);
705     return tstate == GET_TSTATE();
706 }
707 
708 /* Internal initialization/finalization functions called by
709    Py_Initialize/Py_FinalizeEx
710 */
711 void
_PyGILState_Init(PyInterpreterState * i,PyThreadState * t)712 _PyGILState_Init(PyInterpreterState *i, PyThreadState *t)
713 {
714     assert(i && t); /* must init with valid states */
715     autoTLSkey = PyThread_create_key();
716     if (autoTLSkey == -1)
717         Py_FatalError("Could not allocate TLS entry");
718     autoInterpreterState = i;
719     assert(PyThread_get_key_value(autoTLSkey) == NULL);
720     assert(t->gilstate_counter == 0);
721 
722     _PyGILState_NoteThreadState(t);
723 }
724 
725 PyInterpreterState *
_PyGILState_GetInterpreterStateUnsafe(void)726 _PyGILState_GetInterpreterStateUnsafe(void)
727 {
728     return autoInterpreterState;
729 }
730 
731 void
_PyGILState_Fini(void)732 _PyGILState_Fini(void)
733 {
734     PyThread_delete_key(autoTLSkey);
735     autoTLSkey = -1;
736     autoInterpreterState = NULL;
737 }
738 
739 /* Reset the TLS key - called by PyOS_AfterFork().
740  * This should not be necessary, but some - buggy - pthread implementations
741  * don't reset TLS upon fork(), see issue #10517.
742  */
743 void
_PyGILState_Reinit(void)744 _PyGILState_Reinit(void)
745 {
746     PyThreadState *tstate = PyGILState_GetThisThreadState();
747     PyThread_delete_key(autoTLSkey);
748     if ((autoTLSkey = PyThread_create_key()) == -1)
749         Py_FatalError("Could not allocate TLS entry");
750 
751     /* If the thread had an associated auto thread state, reassociate it with
752      * the new key. */
753     if (tstate && PyThread_set_key_value(autoTLSkey, (void *)tstate) < 0)
754         Py_FatalError("Couldn't create autoTLSkey mapping");
755 }
756 
757 /* When a thread state is created for a thread by some mechanism other than
758    PyGILState_Ensure, it's important that the GILState machinery knows about
759    it so it doesn't try to create another thread state for the thread (this is
760    a better fix for SF bug #1010677 than the first one attempted).
761 */
762 static void
_PyGILState_NoteThreadState(PyThreadState * tstate)763 _PyGILState_NoteThreadState(PyThreadState* tstate)
764 {
765     /* If autoTLSkey isn't initialized, this must be the very first
766        threadstate created in Py_Initialize().  Don't do anything for now
767        (we'll be back here when _PyGILState_Init is called). */
768     if (!autoInterpreterState)
769         return;
770 
771     /* Stick the thread state for this thread in thread local storage.
772 
773        The only situation where you can legitimately have more than one
774        thread state for an OS level thread is when there are multiple
775        interpreters.
776 
777        You shouldn't really be using the PyGILState_ APIs anyway (see issues
778        #10915 and #15751).
779 
780        The first thread state created for that given OS level thread will
781        "win", which seems reasonable behaviour.
782     */
783     if (PyThread_get_key_value(autoTLSkey) == NULL) {
784         if (PyThread_set_key_value(autoTLSkey, (void *)tstate) < 0)
785             Py_FatalError("Couldn't create autoTLSkey mapping");
786     }
787 
788     /* PyGILState_Release must not try to delete this thread state. */
789     tstate->gilstate_counter = 1;
790 }
791 
792 /* The public functions */
793 PyThreadState *
PyGILState_GetThisThreadState(void)794 PyGILState_GetThisThreadState(void)
795 {
796     if (autoInterpreterState == NULL)
797         return NULL;
798     return (PyThreadState *)PyThread_get_key_value(autoTLSkey);
799 }
800 
801 int
PyGILState_Check(void)802 PyGILState_Check(void)
803 {
804     PyThreadState *tstate;
805 
806     if (!_PyGILState_check_enabled)
807         return 1;
808 
809     if (autoTLSkey == -1)
810         return 1;
811 
812     tstate = GET_TSTATE();
813     if (tstate == NULL)
814         return 0;
815 
816     return (tstate == PyGILState_GetThisThreadState());
817 }
818 
819 PyGILState_STATE
PyGILState_Ensure(void)820 PyGILState_Ensure(void)
821 {
822     int current;
823     PyThreadState *tcur;
824     /* Note that we do not auto-init Python here - apart from
825        potential races with 2 threads auto-initializing, pep-311
826        spells out other issues.  Embedders are expected to have
827        called Py_Initialize() and usually PyEval_InitThreads().
828     */
829     assert(autoInterpreterState); /* Py_Initialize() hasn't been called! */
830     tcur = (PyThreadState *)PyThread_get_key_value(autoTLSkey);
831     if (tcur == NULL) {
832         /* At startup, Python has no concrete GIL. If PyGILState_Ensure() is
833            called from a new thread for the first time, we need the create the
834            GIL. */
835         PyEval_InitThreads();
836 
837         /* Create a new thread state for this thread */
838         tcur = PyThreadState_New(autoInterpreterState);
839         if (tcur == NULL)
840             Py_FatalError("Couldn't create thread-state for new thread");
841         /* This is our thread state!  We'll need to delete it in the
842            matching call to PyGILState_Release(). */
843         tcur->gilstate_counter = 0;
844         current = 0; /* new thread state is never current */
845     }
846     else
847         current = PyThreadState_IsCurrent(tcur);
848     if (current == 0)
849         PyEval_RestoreThread(tcur);
850     /* Update our counter in the thread-state - no need for locks:
851        - tcur will remain valid as we hold the GIL.
852        - the counter is safe as we are the only thread "allowed"
853          to modify this value
854     */
855     ++tcur->gilstate_counter;
856     return current ? PyGILState_LOCKED : PyGILState_UNLOCKED;
857 }
858 
859 void
PyGILState_Release(PyGILState_STATE oldstate)860 PyGILState_Release(PyGILState_STATE oldstate)
861 {
862     PyThreadState *tcur = (PyThreadState *)PyThread_get_key_value(
863                                                             autoTLSkey);
864     if (tcur == NULL)
865         Py_FatalError("auto-releasing thread-state, "
866                       "but no thread-state for this thread");
867     /* We must hold the GIL and have our thread state current */
868     /* XXX - remove the check - the assert should be fine,
869        but while this is very new (April 2003), the extra check
870        by release-only users can't hurt.
871     */
872     if (! PyThreadState_IsCurrent(tcur))
873         Py_FatalError("This thread state must be current when releasing");
874     assert(PyThreadState_IsCurrent(tcur));
875     --tcur->gilstate_counter;
876     assert(tcur->gilstate_counter >= 0); /* illegal counter value */
877 
878     /* If we're going to destroy this thread-state, we must
879      * clear it while the GIL is held, as destructors may run.
880      */
881     if (tcur->gilstate_counter == 0) {
882         /* can't have been locked when we created it */
883         assert(oldstate == PyGILState_UNLOCKED);
884         PyThreadState_Clear(tcur);
885         /* Delete the thread-state.  Note this releases the GIL too!
886          * It's vital that the GIL be held here, to avoid shutdown
887          * races; see bugs 225673 and 1061968 (that nasty bug has a
888          * habit of coming back).
889          */
890         PyThreadState_DeleteCurrent();
891     }
892     /* Release the lock if necessary */
893     else if (oldstate == PyGILState_UNLOCKED)
894         PyEval_SaveThread();
895 }
896 
897 #endif /* WITH_THREAD */
898 
899 #ifdef __cplusplus
900 }
901 #endif
902 
903 
904