Home | History | Annotate | Download | only in Python
      1 
      2 /* Thread and interpreter state structures and their interfaces */
      3 
      4 #include "Python.h"
      5 #include "internal/pystate.h"
      6 
      7 #define GET_TSTATE() \
      8     ((PyThreadState*)_Py_atomic_load_relaxed(&_PyThreadState_Current))
      9 #define SET_TSTATE(value) \
     10     _Py_atomic_store_relaxed(&_PyThreadState_Current, (uintptr_t)(value))
     11 #define GET_INTERP_STATE() \
     12     (GET_TSTATE()->interp)
     13 
     14 
     15 /* --------------------------------------------------------------------------
     16 CAUTION
     17 
     18 Always use PyMem_RawMalloc() and PyMem_RawFree() directly in this file.  A
     19 number of these functions are advertised as safe to call when the GIL isn't
     20 held, and in a debug build Python redirects (e.g.) PyMem_NEW (etc) to Python's
     21 debugging obmalloc functions.  Those aren't thread-safe (they rely on the GIL
     22 to avoid the expense of doing their own locking).
     23 -------------------------------------------------------------------------- */
     24 
     25 #ifdef HAVE_DLOPEN
     26 #ifdef HAVE_DLFCN_H
     27 #include <dlfcn.h>
     28 #endif
     29 #if !HAVE_DECL_RTLD_LAZY
     30 #define RTLD_LAZY 1
     31 #endif
     32 #endif
     33 
     34 #ifdef __cplusplus
     35 extern "C" {
     36 #endif
     37 
     38 static _PyInitError
     39 _PyRuntimeState_Init_impl(_PyRuntimeState *runtime)
     40 {
     41     memset(runtime, 0, sizeof(*runtime));
     42 
     43     _PyGC_Initialize(&runtime->gc);
     44     _PyEval_Initialize(&runtime->ceval);
     45 
     46     runtime->gilstate.check_enabled = 1;
     47 
     48     /* A TSS key must be initialized with Py_tss_NEEDS_INIT
     49        in accordance with the specification. */
     50     Py_tss_t initial = Py_tss_NEEDS_INIT;
     51     runtime->gilstate.autoTSSkey = initial;
     52 
     53     runtime->interpreters.mutex = PyThread_allocate_lock();
     54     if (runtime->interpreters.mutex == NULL) {
     55         return _Py_INIT_ERR("Can't initialize threads for interpreter");
     56     }
     57     runtime->interpreters.next_id = -1;
     58 
     59     return _Py_INIT_OK();
     60 }
     61 
     62 _PyInitError
     63 _PyRuntimeState_Init(_PyRuntimeState *runtime)
     64 {
     65     /* Force default allocator, since _PyRuntimeState_Fini() must
     66        use the same allocator than this function. */
     67     PyMemAllocatorEx old_alloc;
     68     _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
     69 
     70     _PyInitError err = _PyRuntimeState_Init_impl(runtime);
     71 
     72     PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
     73     return err;
     74 }
     75 
     76 void
     77 _PyRuntimeState_Fini(_PyRuntimeState *runtime)
     78 {
     79     /* Force the allocator used by _PyRuntimeState_Init(). */
     80     PyMemAllocatorEx old_alloc;
     81     _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
     82 
     83     if (runtime->interpreters.mutex != NULL) {
     84         PyThread_free_lock(runtime->interpreters.mutex);
     85         runtime->interpreters.mutex = NULL;
     86     }
     87 
     88     PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
     89 }
     90 
     91 #define HEAD_LOCK() PyThread_acquire_lock(_PyRuntime.interpreters.mutex, \
     92                                           WAIT_LOCK)
     93 #define HEAD_UNLOCK() PyThread_release_lock(_PyRuntime.interpreters.mutex)
     94 
     95 static void _PyGILState_NoteThreadState(PyThreadState* tstate);
     96 
     97 _PyInitError
     98 _PyInterpreterState_Enable(_PyRuntimeState *runtime)
     99 {
    100     runtime->interpreters.next_id = 0;
    101 
    102     /* Py_Finalize() calls _PyRuntimeState_Fini() which clears the mutex.
    103        Create a new mutex if needed. */
    104     if (runtime->interpreters.mutex == NULL) {
    105         /* Force default allocator, since _PyRuntimeState_Fini() must
    106            use the same allocator than this function. */
    107         PyMemAllocatorEx old_alloc;
    108         _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
    109 
    110         runtime->interpreters.mutex = PyThread_allocate_lock();
    111 
    112         PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
    113 
    114         if (runtime->interpreters.mutex == NULL) {
    115             return _Py_INIT_ERR("Can't initialize threads for interpreter");
    116         }
    117     }
    118 
    119     return _Py_INIT_OK();
    120 }
    121 
    122 PyInterpreterState *
    123 PyInterpreterState_New(void)
    124 {
    125     PyInterpreterState *interp = (PyInterpreterState *)
    126                                  PyMem_RawMalloc(sizeof(PyInterpreterState));
    127 
    128     if (interp == NULL) {
    129         return NULL;
    130     }
    131 
    132     interp->id_refcount = -1;
    133     interp->id_mutex = NULL;
    134     interp->modules = NULL;
    135     interp->modules_by_index = NULL;
    136     interp->sysdict = NULL;
    137     interp->builtins = NULL;
    138     interp->builtins_copy = NULL;
    139     interp->tstate_head = NULL;
    140     interp->check_interval = 100;
    141     interp->num_threads = 0;
    142     interp->pythread_stacksize = 0;
    143     interp->codec_search_path = NULL;
    144     interp->codec_search_cache = NULL;
    145     interp->codec_error_registry = NULL;
    146     interp->codecs_initialized = 0;
    147     interp->fscodec_initialized = 0;
    148     interp->core_config = _PyCoreConfig_INIT;
    149     interp->config = _PyMainInterpreterConfig_INIT;
    150     interp->importlib = NULL;
    151     interp->import_func = NULL;
    152     interp->eval_frame = _PyEval_EvalFrameDefault;
    153     interp->co_extra_user_count = 0;
    154 #ifdef HAVE_DLOPEN
    155 #if HAVE_DECL_RTLD_NOW
    156     interp->dlopenflags = RTLD_NOW;
    157 #else
    158     interp->dlopenflags = RTLD_LAZY;
    159 #endif
    160 #endif
    161 #ifdef HAVE_FORK
    162     interp->before_forkers = NULL;
    163     interp->after_forkers_parent = NULL;
    164     interp->after_forkers_child = NULL;
    165 #endif
    166     interp->pyexitfunc = NULL;
    167     interp->pyexitmodule = NULL;
    168 
    169     HEAD_LOCK();
    170     interp->next = _PyRuntime.interpreters.head;
    171     if (_PyRuntime.interpreters.main == NULL) {
    172         _PyRuntime.interpreters.main = interp;
    173     }
    174     _PyRuntime.interpreters.head = interp;
    175     if (_PyRuntime.interpreters.next_id < 0) {
    176         /* overflow or Py_Initialize() not called! */
    177         PyErr_SetString(PyExc_RuntimeError,
    178                         "failed to get an interpreter ID");
    179         /* XXX deallocate! */
    180         interp = NULL;
    181     } else {
    182         interp->id = _PyRuntime.interpreters.next_id;
    183         _PyRuntime.interpreters.next_id += 1;
    184     }
    185     HEAD_UNLOCK();
    186 
    187     interp->tstate_next_unique_id = 0;
    188 
    189     return interp;
    190 }
    191 
    192 
    193 void
    194 PyInterpreterState_Clear(PyInterpreterState *interp)
    195 {
    196     PyThreadState *p;
    197     HEAD_LOCK();
    198     for (p = interp->tstate_head; p != NULL; p = p->next)
    199         PyThreadState_Clear(p);
    200     HEAD_UNLOCK();
    201     _PyCoreConfig_Clear(&interp->core_config);
    202     _PyMainInterpreterConfig_Clear(&interp->config);
    203     Py_CLEAR(interp->codec_search_path);
    204     Py_CLEAR(interp->codec_search_cache);
    205     Py_CLEAR(interp->codec_error_registry);
    206     Py_CLEAR(interp->modules);
    207     Py_CLEAR(interp->modules_by_index);
    208     Py_CLEAR(interp->sysdict);
    209     Py_CLEAR(interp->builtins);
    210     Py_CLEAR(interp->builtins_copy);
    211     Py_CLEAR(interp->importlib);
    212     Py_CLEAR(interp->import_func);
    213 #ifdef HAVE_FORK
    214     Py_CLEAR(interp->before_forkers);
    215     Py_CLEAR(interp->after_forkers_parent);
    216     Py_CLEAR(interp->after_forkers_child);
    217 #endif
    218 }
    219 
    220 
    221 static void
    222 zapthreads(PyInterpreterState *interp)
    223 {
    224     PyThreadState *p;
    225     /* No need to lock the mutex here because this should only happen
    226        when the threads are all really dead (XXX famous last words). */
    227     while ((p = interp->tstate_head) != NULL) {
    228         PyThreadState_Delete(p);
    229     }
    230 }
    231 
    232 
    233 void
    234 PyInterpreterState_Delete(PyInterpreterState *interp)
    235 {
    236     PyInterpreterState **p;
    237     zapthreads(interp);
    238     HEAD_LOCK();
    239     for (p = &_PyRuntime.interpreters.head; ; p = &(*p)->next) {
    240         if (*p == NULL)
    241             Py_FatalError(
    242                 "PyInterpreterState_Delete: invalid interp");
    243         if (*p == interp)
    244             break;
    245     }
    246     if (interp->tstate_head != NULL)
    247         Py_FatalError("PyInterpreterState_Delete: remaining threads");
    248     *p = interp->next;
    249     if (_PyRuntime.interpreters.main == interp) {
    250         _PyRuntime.interpreters.main = NULL;
    251         if (_PyRuntime.interpreters.head != NULL)
    252             Py_FatalError("PyInterpreterState_Delete: remaining subinterpreters");
    253     }
    254     HEAD_UNLOCK();
    255     if (interp->id_mutex != NULL) {
    256         PyThread_free_lock(interp->id_mutex);
    257     }
    258     PyMem_RawFree(interp);
    259 }
    260 
    261 
    262 int64_t
    263 PyInterpreterState_GetID(PyInterpreterState *interp)
    264 {
    265     if (interp == NULL) {
    266         PyErr_SetString(PyExc_RuntimeError, "no interpreter provided");
    267         return -1;
    268     }
    269     return interp->id;
    270 }
    271 
    272 
    273 PyInterpreterState *
    274 _PyInterpreterState_LookUpID(PY_INT64_T requested_id)
    275 {
    276     if (requested_id < 0)
    277         goto error;
    278 
    279     PyInterpreterState *interp = PyInterpreterState_Head();
    280     while (interp != NULL) {
    281         PY_INT64_T id = PyInterpreterState_GetID(interp);
    282         if (id < 0)
    283             return NULL;
    284         if (requested_id == id)
    285             return interp;
    286         interp = PyInterpreterState_Next(interp);
    287     }
    288 
    289 error:
    290     PyErr_Format(PyExc_RuntimeError,
    291                  "unrecognized interpreter ID %lld", requested_id);
    292     return NULL;
    293 }
    294 
    295 
    296 int
    297 _PyInterpreterState_IDInitref(PyInterpreterState *interp)
    298 {
    299     if (interp->id_mutex != NULL) {
    300         return 0;
    301     }
    302     interp->id_mutex = PyThread_allocate_lock();
    303     if (interp->id_mutex == NULL) {
    304         PyErr_SetString(PyExc_RuntimeError,
    305                         "failed to create init interpreter ID mutex");
    306         return -1;
    307     }
    308     interp->id_refcount = 0;
    309     return 0;
    310 }
    311 
    312 
    313 void
    314 _PyInterpreterState_IDIncref(PyInterpreterState *interp)
    315 {
    316     if (interp->id_mutex == NULL) {
    317         return;
    318     }
    319     PyThread_acquire_lock(interp->id_mutex, WAIT_LOCK);
    320     interp->id_refcount += 1;
    321     PyThread_release_lock(interp->id_mutex);
    322 }
    323 
    324 
    325 void
    326 _PyInterpreterState_IDDecref(PyInterpreterState *interp)
    327 {
    328     if (interp->id_mutex == NULL) {
    329         return;
    330     }
    331     PyThread_acquire_lock(interp->id_mutex, WAIT_LOCK);
    332     assert(interp->id_refcount != 0);
    333     interp->id_refcount -= 1;
    334     int64_t refcount = interp->id_refcount;
    335     PyThread_release_lock(interp->id_mutex);
    336 
    337     if (refcount == 0) {
    338         // XXX Using the "head" thread isn't strictly correct.
    339         PyThreadState *tstate = PyInterpreterState_ThreadHead(interp);
    340         // XXX Possible GILState issues?
    341         PyThreadState *save_tstate = PyThreadState_Swap(tstate);
    342         Py_EndInterpreter(tstate);
    343         PyThreadState_Swap(save_tstate);
    344     }
    345 }
    346 
    347 
    348 /* Default implementation for _PyThreadState_GetFrame */
    349 static struct _frame *
    350 threadstate_getframe(PyThreadState *self)
    351 {
    352     return self->frame;
    353 }
    354 
    355 static PyThreadState *
    356 new_threadstate(PyInterpreterState *interp, int init)
    357 {
    358     PyThreadState *tstate = (PyThreadState *)PyMem_RawMalloc(sizeof(PyThreadState));
    359 
    360     if (_PyThreadState_GetFrame == NULL)
    361         _PyThreadState_GetFrame = threadstate_getframe;
    362 
    363     if (tstate != NULL) {
    364         tstate->interp = interp;
    365 
    366         tstate->frame = NULL;
    367         tstate->recursion_depth = 0;
    368         tstate->overflowed = 0;
    369         tstate->recursion_critical = 0;
    370         tstate->stackcheck_counter = 0;
    371         tstate->tracing = 0;
    372         tstate->use_tracing = 0;
    373         tstate->gilstate_counter = 0;
    374         tstate->async_exc = NULL;
    375         tstate->thread_id = PyThread_get_thread_ident();
    376 
    377         tstate->dict = NULL;
    378 
    379         tstate->curexc_type = NULL;
    380         tstate->curexc_value = NULL;
    381         tstate->curexc_traceback = NULL;
    382 
    383         tstate->exc_state.exc_type = NULL;
    384         tstate->exc_state.exc_value = NULL;
    385         tstate->exc_state.exc_traceback = NULL;
    386         tstate->exc_state.previous_item = NULL;
    387         tstate->exc_info = &tstate->exc_state;
    388 
    389         tstate->c_profilefunc = NULL;
    390         tstate->c_tracefunc = NULL;
    391         tstate->c_profileobj = NULL;
    392         tstate->c_traceobj = NULL;
    393 
    394         tstate->trash_delete_nesting = 0;
    395         tstate->trash_delete_later = NULL;
    396         tstate->on_delete = NULL;
    397         tstate->on_delete_data = NULL;
    398 
    399         tstate->coroutine_origin_tracking_depth = 0;
    400 
    401         tstate->coroutine_wrapper = NULL;
    402         tstate->in_coroutine_wrapper = 0;
    403 
    404         tstate->async_gen_firstiter = NULL;
    405         tstate->async_gen_finalizer = NULL;
    406 
    407         tstate->context = NULL;
    408         tstate->context_ver = 1;
    409 
    410         tstate->id = ++interp->tstate_next_unique_id;
    411 
    412         if (init)
    413             _PyThreadState_Init(tstate);
    414 
    415         HEAD_LOCK();
    416         tstate->prev = NULL;
    417         tstate->next = interp->tstate_head;
    418         if (tstate->next)
    419             tstate->next->prev = tstate;
    420         interp->tstate_head = tstate;
    421         HEAD_UNLOCK();
    422     }
    423 
    424     return tstate;
    425 }
    426 
    427 PyThreadState *
    428 PyThreadState_New(PyInterpreterState *interp)
    429 {
    430     return new_threadstate(interp, 1);
    431 }
    432 
    433 PyThreadState *
    434 _PyThreadState_Prealloc(PyInterpreterState *interp)
    435 {
    436     return new_threadstate(interp, 0);
    437 }
    438 
    439 void
    440 _PyThreadState_Init(PyThreadState *tstate)
    441 {
    442     _PyGILState_NoteThreadState(tstate);
    443 }
    444 
    445 PyObject*
    446 PyState_FindModule(struct PyModuleDef* module)
    447 {
    448     Py_ssize_t index = module->m_base.m_index;
    449     PyInterpreterState *state = GET_INTERP_STATE();
    450     PyObject *res;
    451     if (module->m_slots) {
    452         return NULL;
    453     }
    454     if (index == 0)
    455         return NULL;
    456     if (state->modules_by_index == NULL)
    457         return NULL;
    458     if (index >= PyList_GET_SIZE(state->modules_by_index))
    459         return NULL;
    460     res = PyList_GET_ITEM(state->modules_by_index, index);
    461     return res==Py_None ? NULL : res;
    462 }
    463 
    464 int
    465 _PyState_AddModule(PyObject* module, struct PyModuleDef* def)
    466 {
    467     PyInterpreterState *state;
    468     if (!def) {
    469         assert(PyErr_Occurred());
    470         return -1;
    471     }
    472     if (def->m_slots) {
    473         PyErr_SetString(PyExc_SystemError,
    474                         "PyState_AddModule called on module with slots");
    475         return -1;
    476     }
    477     state = GET_INTERP_STATE();
    478     if (!state->modules_by_index) {
    479         state->modules_by_index = PyList_New(0);
    480         if (!state->modules_by_index)
    481             return -1;
    482     }
    483     while(PyList_GET_SIZE(state->modules_by_index) <= def->m_base.m_index)
    484         if (PyList_Append(state->modules_by_index, Py_None) < 0)
    485             return -1;
    486     Py_INCREF(module);
    487     return PyList_SetItem(state->modules_by_index,
    488                           def->m_base.m_index, module);
    489 }
    490 
    491 int
    492 PyState_AddModule(PyObject* module, struct PyModuleDef* def)
    493 {
    494     Py_ssize_t index;
    495     PyInterpreterState *state = GET_INTERP_STATE();
    496     if (!def) {
    497         Py_FatalError("PyState_AddModule: Module Definition is NULL");
    498         return -1;
    499     }
    500     index = def->m_base.m_index;
    501     if (state->modules_by_index) {
    502         if(PyList_GET_SIZE(state->modules_by_index) >= index) {
    503             if(module == PyList_GET_ITEM(state->modules_by_index, index)) {
    504                 Py_FatalError("PyState_AddModule: Module already added!");
    505                 return -1;
    506             }
    507         }
    508     }
    509     return _PyState_AddModule(module, def);
    510 }
    511 
    512 int
    513 PyState_RemoveModule(struct PyModuleDef* def)
    514 {
    515     PyInterpreterState *state;
    516     Py_ssize_t index = def->m_base.m_index;
    517     if (def->m_slots) {
    518         PyErr_SetString(PyExc_SystemError,
    519                         "PyState_RemoveModule called on module with slots");
    520         return -1;
    521     }
    522     state = GET_INTERP_STATE();
    523     if (index == 0) {
    524         Py_FatalError("PyState_RemoveModule: Module index invalid.");
    525         return -1;
    526     }
    527     if (state->modules_by_index == NULL) {
    528         Py_FatalError("PyState_RemoveModule: Interpreters module-list not acessible.");
    529         return -1;
    530     }
    531     if (index > PyList_GET_SIZE(state->modules_by_index)) {
    532         Py_FatalError("PyState_RemoveModule: Module index out of bounds.");
    533         return -1;
    534     }
    535     Py_INCREF(Py_None);
    536     return PyList_SetItem(state->modules_by_index, index, Py_None);
    537 }
    538 
    539 /* used by import.c:PyImport_Cleanup */
    540 void
    541 _PyState_ClearModules(void)
    542 {
    543     PyInterpreterState *state = GET_INTERP_STATE();
    544     if (state->modules_by_index) {
    545         Py_ssize_t i;
    546         for (i = 0; i < PyList_GET_SIZE(state->modules_by_index); i++) {
    547             PyObject *m = PyList_GET_ITEM(state->modules_by_index, i);
    548             if (PyModule_Check(m)) {
    549                 /* cleanup the saved copy of module dicts */
    550                 PyModuleDef *md = PyModule_GetDef(m);
    551                 if (md)
    552                     Py_CLEAR(md->m_base.m_copy);
    553             }
    554         }
    555         /* Setting modules_by_index to NULL could be dangerous, so we
    556            clear the list instead. */
    557         if (PyList_SetSlice(state->modules_by_index,
    558                             0, PyList_GET_SIZE(state->modules_by_index),
    559                             NULL))
    560             PyErr_WriteUnraisable(state->modules_by_index);
    561     }
    562 }
    563 
    564 void
    565 PyThreadState_Clear(PyThreadState *tstate)
    566 {
    567     if (Py_VerboseFlag && tstate->frame != NULL)
    568         fprintf(stderr,
    569           "PyThreadState_Clear: warning: thread still has a frame\n");
    570 
    571     Py_CLEAR(tstate->frame);
    572 
    573     Py_CLEAR(tstate->dict);
    574     Py_CLEAR(tstate->async_exc);
    575 
    576     Py_CLEAR(tstate->curexc_type);
    577     Py_CLEAR(tstate->curexc_value);
    578     Py_CLEAR(tstate->curexc_traceback);
    579 
    580     Py_CLEAR(tstate->exc_state.exc_type);
    581     Py_CLEAR(tstate->exc_state.exc_value);
    582     Py_CLEAR(tstate->exc_state.exc_traceback);
    583 
    584     /* The stack of exception states should contain just this thread. */
    585     if (Py_VerboseFlag && tstate->exc_info != &tstate->exc_state) {
    586         fprintf(stderr,
    587           "PyThreadState_Clear: warning: thread still has a generator\n");
    588     }
    589 
    590     tstate->c_profilefunc = NULL;
    591     tstate->c_tracefunc = NULL;
    592     Py_CLEAR(tstate->c_profileobj);
    593     Py_CLEAR(tstate->c_traceobj);
    594 
    595     Py_CLEAR(tstate->coroutine_wrapper);
    596     Py_CLEAR(tstate->async_gen_firstiter);
    597     Py_CLEAR(tstate->async_gen_finalizer);
    598 
    599     Py_CLEAR(tstate->context);
    600 }
    601 
    602 
    603 /* Common code for PyThreadState_Delete() and PyThreadState_DeleteCurrent() */
    604 static void
    605 tstate_delete_common(PyThreadState *tstate)
    606 {
    607     PyInterpreterState *interp;
    608     if (tstate == NULL)
    609         Py_FatalError("PyThreadState_Delete: NULL tstate");
    610     interp = tstate->interp;
    611     if (interp == NULL)
    612         Py_FatalError("PyThreadState_Delete: NULL interp");
    613     HEAD_LOCK();
    614     if (tstate->prev)
    615         tstate->prev->next = tstate->next;
    616     else
    617         interp->tstate_head = tstate->next;
    618     if (tstate->next)
    619         tstate->next->prev = tstate->prev;
    620     HEAD_UNLOCK();
    621     if (tstate->on_delete != NULL) {
    622         tstate->on_delete(tstate->on_delete_data);
    623     }
    624     PyMem_RawFree(tstate);
    625 }
    626 
    627 
    628 void
    629 PyThreadState_Delete(PyThreadState *tstate)
    630 {
    631     if (tstate == GET_TSTATE())
    632         Py_FatalError("PyThreadState_Delete: tstate is still current");
    633     if (_PyRuntime.gilstate.autoInterpreterState &&
    634         PyThread_tss_get(&_PyRuntime.gilstate.autoTSSkey) == tstate)
    635     {
    636         PyThread_tss_set(&_PyRuntime.gilstate.autoTSSkey, NULL);
    637     }
    638     tstate_delete_common(tstate);
    639 }
    640 
    641 
    642 void
    643 PyThreadState_DeleteCurrent()
    644 {
    645     PyThreadState *tstate = GET_TSTATE();
    646     if (tstate == NULL)
    647         Py_FatalError(
    648             "PyThreadState_DeleteCurrent: no current tstate");
    649     tstate_delete_common(tstate);
    650     if (_PyRuntime.gilstate.autoInterpreterState &&
    651         PyThread_tss_get(&_PyRuntime.gilstate.autoTSSkey) == tstate)
    652     {
    653         PyThread_tss_set(&_PyRuntime.gilstate.autoTSSkey, NULL);
    654     }
    655     SET_TSTATE(NULL);
    656     PyEval_ReleaseLock();
    657 }
    658 
    659 
    660 /*
    661  * Delete all thread states except the one passed as argument.
    662  * Note that, if there is a current thread state, it *must* be the one
    663  * passed as argument.  Also, this won't touch any other interpreters
    664  * than the current one, since we don't know which thread state should
    665  * be kept in those other interpreteres.
    666  */
    667 void
    668 _PyThreadState_DeleteExcept(PyThreadState *tstate)
    669 {
    670     PyInterpreterState *interp = tstate->interp;
    671     PyThreadState *p, *next, *garbage;
    672     HEAD_LOCK();
    673     /* Remove all thread states, except tstate, from the linked list of
    674        thread states.  This will allow calling PyThreadState_Clear()
    675        without holding the lock. */
    676     garbage = interp->tstate_head;
    677     if (garbage == tstate)
    678         garbage = tstate->next;
    679     if (tstate->prev)
    680         tstate->prev->next = tstate->next;
    681     if (tstate->next)
    682         tstate->next->prev = tstate->prev;
    683     tstate->prev = tstate->next = NULL;
    684     interp->tstate_head = tstate;
    685     HEAD_UNLOCK();
    686     /* Clear and deallocate all stale thread states.  Even if this
    687        executes Python code, we should be safe since it executes
    688        in the current thread, not one of the stale threads. */
    689     for (p = garbage; p; p = next) {
    690         next = p->next;
    691         PyThreadState_Clear(p);
    692         PyMem_RawFree(p);
    693     }
    694 }
    695 
    696 
    697 PyThreadState *
    698 _PyThreadState_UncheckedGet(void)
    699 {
    700     return GET_TSTATE();
    701 }
    702 
    703 
    704 PyThreadState *
    705 PyThreadState_Get(void)
    706 {
    707     PyThreadState *tstate = GET_TSTATE();
    708     if (tstate == NULL)
    709         Py_FatalError("PyThreadState_Get: no current thread");
    710 
    711     return tstate;
    712 }
    713 
    714 
    715 PyThreadState *
    716 PyThreadState_Swap(PyThreadState *newts)
    717 {
    718     PyThreadState *oldts = GET_TSTATE();
    719 
    720     SET_TSTATE(newts);
    721     /* It should not be possible for more than one thread state
    722        to be used for a thread.  Check this the best we can in debug
    723        builds.
    724     */
    725 #if defined(Py_DEBUG)
    726     if (newts) {
    727         /* This can be called from PyEval_RestoreThread(). Similar
    728            to it, we need to ensure errno doesn't change.
    729         */
    730         int err = errno;
    731         PyThreadState *check = PyGILState_GetThisThreadState();
    732         if (check && check->interp == newts->interp && check != newts)
    733             Py_FatalError("Invalid thread state for this thread");
    734         errno = err;
    735     }
    736 #endif
    737     return oldts;
    738 }
    739 
    740 /* An extension mechanism to store arbitrary additional per-thread state.
    741    PyThreadState_GetDict() returns a dictionary that can be used to hold such
    742    state; the caller should pick a unique key and store its state there.  If
    743    PyThreadState_GetDict() returns NULL, an exception has *not* been raised
    744    and the caller should assume no per-thread state is available. */
    745 
    746 PyObject *
    747 PyThreadState_GetDict(void)
    748 {
    749     PyThreadState *tstate = GET_TSTATE();
    750     if (tstate == NULL)
    751         return NULL;
    752 
    753     if (tstate->dict == NULL) {
    754         PyObject *d;
    755         tstate->dict = d = PyDict_New();
    756         if (d == NULL)
    757             PyErr_Clear();
    758     }
    759     return tstate->dict;
    760 }
    761 
    762 
    763 /* Asynchronously raise an exception in a thread.
    764    Requested by Just van Rossum and Alex Martelli.
    765    To prevent naive misuse, you must write your own extension
    766    to call this, or use ctypes.  Must be called with the GIL held.
    767    Returns the number of tstates modified (normally 1, but 0 if `id` didn't
    768    match any known thread id).  Can be called with exc=NULL to clear an
    769    existing async exception.  This raises no exceptions. */
    770 
    771 int
    772 PyThreadState_SetAsyncExc(unsigned long id, PyObject *exc)
    773 {
    774     PyInterpreterState *interp = GET_INTERP_STATE();
    775     PyThreadState *p;
    776 
    777     /* Although the GIL is held, a few C API functions can be called
    778      * without the GIL held, and in particular some that create and
    779      * destroy thread and interpreter states.  Those can mutate the
    780      * list of thread states we're traversing, so to prevent that we lock
    781      * head_mutex for the duration.
    782      */
    783     HEAD_LOCK();
    784     for (p = interp->tstate_head; p != NULL; p = p->next) {
    785         if (p->thread_id == id) {
    786             /* Tricky:  we need to decref the current value
    787              * (if any) in p->async_exc, but that can in turn
    788              * allow arbitrary Python code to run, including
    789              * perhaps calls to this function.  To prevent
    790              * deadlock, we need to release head_mutex before
    791              * the decref.
    792              */
    793             PyObject *old_exc = p->async_exc;
    794             Py_XINCREF(exc);
    795             p->async_exc = exc;
    796             HEAD_UNLOCK();
    797             Py_XDECREF(old_exc);
    798             _PyEval_SignalAsyncExc();
    799             return 1;
    800         }
    801     }
    802     HEAD_UNLOCK();
    803     return 0;
    804 }
    805 
    806 
    807 /* Routines for advanced debuggers, requested by David Beazley.
    808    Don't use unless you know what you are doing! */
    809 
    810 PyInterpreterState *
    811 PyInterpreterState_Head(void)
    812 {
    813     return _PyRuntime.interpreters.head;
    814 }
    815 
    816 PyInterpreterState *
    817 PyInterpreterState_Main(void)
    818 {
    819     return _PyRuntime.interpreters.main;
    820 }
    821 
    822 PyInterpreterState *
    823 PyInterpreterState_Next(PyInterpreterState *interp) {
    824     return interp->next;
    825 }
    826 
    827 PyThreadState *
    828 PyInterpreterState_ThreadHead(PyInterpreterState *interp) {
    829     return interp->tstate_head;
    830 }
    831 
    832 PyThreadState *
    833 PyThreadState_Next(PyThreadState *tstate) {
    834     return tstate->next;
    835 }
    836 
    837 /* The implementation of sys._current_frames().  This is intended to be
    838    called with the GIL held, as it will be when called via
    839    sys._current_frames().  It's possible it would work fine even without
    840    the GIL held, but haven't thought enough about that.
    841 */
    842 PyObject *
    843 _PyThread_CurrentFrames(void)
    844 {
    845     PyObject *result;
    846     PyInterpreterState *i;
    847 
    848     result = PyDict_New();
    849     if (result == NULL)
    850         return NULL;
    851 
    852     /* for i in all interpreters:
    853      *     for t in all of i's thread states:
    854      *          if t's frame isn't NULL, map t's id to its frame
    855      * Because these lists can mutate even when the GIL is held, we
    856      * need to grab head_mutex for the duration.
    857      */
    858     HEAD_LOCK();
    859     for (i = _PyRuntime.interpreters.head; i != NULL; i = i->next) {
    860         PyThreadState *t;
    861         for (t = i->tstate_head; t != NULL; t = t->next) {
    862             PyObject *id;
    863             int stat;
    864             struct _frame *frame = t->frame;
    865             if (frame == NULL)
    866                 continue;
    867             id = PyLong_FromUnsignedLong(t->thread_id);
    868             if (id == NULL)
    869                 goto Fail;
    870             stat = PyDict_SetItem(result, id, (PyObject *)frame);
    871             Py_DECREF(id);
    872             if (stat < 0)
    873                 goto Fail;
    874         }
    875     }
    876     HEAD_UNLOCK();
    877     return result;
    878 
    879  Fail:
    880     HEAD_UNLOCK();
    881     Py_DECREF(result);
    882     return NULL;
    883 }
    884 
    885 /* Python "auto thread state" API. */
    886 
    887 /* Keep this as a static, as it is not reliable!  It can only
    888    ever be compared to the state for the *current* thread.
    889    * If not equal, then it doesn't matter that the actual
    890      value may change immediately after comparison, as it can't
    891      possibly change to the current thread's state.
    892    * If equal, then the current thread holds the lock, so the value can't
    893      change until we yield the lock.
    894 */
    895 static int
    896 PyThreadState_IsCurrent(PyThreadState *tstate)
    897 {
    898     /* Must be the tstate for this thread */
    899     assert(PyGILState_GetThisThreadState()==tstate);
    900     return tstate == GET_TSTATE();
    901 }
    902 
    903 /* Internal initialization/finalization functions called by
    904    Py_Initialize/Py_FinalizeEx
    905 */
    906 void
    907 _PyGILState_Init(PyInterpreterState *i, PyThreadState *t)
    908 {
    909     assert(i && t); /* must init with valid states */
    910     if (PyThread_tss_create(&_PyRuntime.gilstate.autoTSSkey) != 0) {
    911         Py_FatalError("Could not allocate TSS entry");
    912     }
    913     _PyRuntime.gilstate.autoInterpreterState = i;
    914     assert(PyThread_tss_get(&_PyRuntime.gilstate.autoTSSkey) == NULL);
    915     assert(t->gilstate_counter == 0);
    916 
    917     _PyGILState_NoteThreadState(t);
    918 }
    919 
    920 PyInterpreterState *
    921 _PyGILState_GetInterpreterStateUnsafe(void)
    922 {
    923     return _PyRuntime.gilstate.autoInterpreterState;
    924 }
    925 
    926 void
    927 _PyGILState_Fini(void)
    928 {
    929     PyThread_tss_delete(&_PyRuntime.gilstate.autoTSSkey);
    930     _PyRuntime.gilstate.autoInterpreterState = NULL;
    931 }
    932 
    933 /* Reset the TSS key - called by PyOS_AfterFork_Child().
    934  * This should not be necessary, but some - buggy - pthread implementations
    935  * don't reset TSS upon fork(), see issue #10517.
    936  */
    937 void
    938 _PyGILState_Reinit(void)
    939 {
    940     /* Force default allocator, since _PyRuntimeState_Fini() must
    941        use the same allocator than this function. */
    942     PyMemAllocatorEx old_alloc;
    943     _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
    944 
    945     _PyRuntime.interpreters.mutex = PyThread_allocate_lock();
    946 
    947     PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
    948 
    949     if (_PyRuntime.interpreters.mutex == NULL) {
    950         Py_FatalError("Can't initialize threads for interpreter");
    951     }
    952 
    953     PyThreadState *tstate = PyGILState_GetThisThreadState();
    954     PyThread_tss_delete(&_PyRuntime.gilstate.autoTSSkey);
    955     if (PyThread_tss_create(&_PyRuntime.gilstate.autoTSSkey) != 0) {
    956         Py_FatalError("Could not allocate TSS entry");
    957     }
    958 
    959     /* If the thread had an associated auto thread state, reassociate it with
    960      * the new key. */
    961     if (tstate &&
    962         PyThread_tss_set(&_PyRuntime.gilstate.autoTSSkey, (void *)tstate) != 0)
    963     {
    964         Py_FatalError("Couldn't create autoTSSkey mapping");
    965     }
    966 }
    967 
    968 /* When a thread state is created for a thread by some mechanism other than
    969    PyGILState_Ensure, it's important that the GILState machinery knows about
    970    it so it doesn't try to create another thread state for the thread (this is
    971    a better fix for SF bug #1010677 than the first one attempted).
    972 */
    973 static void
    974 _PyGILState_NoteThreadState(PyThreadState* tstate)
    975 {
    976     /* If autoTSSkey isn't initialized, this must be the very first
    977        threadstate created in Py_Initialize().  Don't do anything for now
    978        (we'll be back here when _PyGILState_Init is called). */
    979     if (!_PyRuntime.gilstate.autoInterpreterState)
    980         return;
    981 
    982     /* Stick the thread state for this thread in thread specific storage.
    983 
    984        The only situation where you can legitimately have more than one
    985        thread state for an OS level thread is when there are multiple
    986        interpreters.
    987 
    988        You shouldn't really be using the PyGILState_ APIs anyway (see issues
    989        #10915 and #15751).
    990 
    991        The first thread state created for that given OS level thread will
    992        "win", which seems reasonable behaviour.
    993     */
    994     if (PyThread_tss_get(&_PyRuntime.gilstate.autoTSSkey) == NULL) {
    995         if ((PyThread_tss_set(&_PyRuntime.gilstate.autoTSSkey, (void *)tstate)
    996              ) != 0)
    997         {
    998             Py_FatalError("Couldn't create autoTSSkey mapping");
    999         }
   1000     }
   1001 
   1002     /* PyGILState_Release must not try to delete this thread state. */
   1003     tstate->gilstate_counter = 1;
   1004 }
   1005 
   1006 /* The public functions */
   1007 PyThreadState *
   1008 PyGILState_GetThisThreadState(void)
   1009 {
   1010     if (_PyRuntime.gilstate.autoInterpreterState == NULL)
   1011         return NULL;
   1012     return (PyThreadState *)PyThread_tss_get(&_PyRuntime.gilstate.autoTSSkey);
   1013 }
   1014 
   1015 int
   1016 PyGILState_Check(void)
   1017 {
   1018     PyThreadState *tstate;
   1019 
   1020     if (!_PyGILState_check_enabled)
   1021         return 1;
   1022 
   1023     if (!PyThread_tss_is_created(&_PyRuntime.gilstate.autoTSSkey)) {
   1024         return 1;
   1025     }
   1026 
   1027     tstate = GET_TSTATE();
   1028     if (tstate == NULL)
   1029         return 0;
   1030 
   1031     return (tstate == PyGILState_GetThisThreadState());
   1032 }
   1033 
   1034 PyGILState_STATE
   1035 PyGILState_Ensure(void)
   1036 {
   1037     int current;
   1038     PyThreadState *tcur;
   1039     int need_init_threads = 0;
   1040 
   1041     /* Note that we do not auto-init Python here - apart from
   1042        potential races with 2 threads auto-initializing, pep-311
   1043        spells out other issues.  Embedders are expected to have
   1044        called Py_Initialize() and usually PyEval_InitThreads().
   1045     */
   1046     /* Py_Initialize() hasn't been called! */
   1047     assert(_PyRuntime.gilstate.autoInterpreterState);
   1048 
   1049     tcur = (PyThreadState *)PyThread_tss_get(&_PyRuntime.gilstate.autoTSSkey);
   1050     if (tcur == NULL) {
   1051         need_init_threads = 1;
   1052 
   1053         /* Create a new thread state for this thread */
   1054         tcur = PyThreadState_New(_PyRuntime.gilstate.autoInterpreterState);
   1055         if (tcur == NULL)
   1056             Py_FatalError("Couldn't create thread-state for new thread");
   1057         /* This is our thread state!  We'll need to delete it in the
   1058            matching call to PyGILState_Release(). */
   1059         tcur->gilstate_counter = 0;
   1060         current = 0; /* new thread state is never current */
   1061     }
   1062     else {
   1063         current = PyThreadState_IsCurrent(tcur);
   1064     }
   1065 
   1066     if (current == 0) {
   1067         PyEval_RestoreThread(tcur);
   1068     }
   1069 
   1070     /* Update our counter in the thread-state - no need for locks:
   1071        - tcur will remain valid as we hold the GIL.
   1072        - the counter is safe as we are the only thread "allowed"
   1073          to modify this value
   1074     */
   1075     ++tcur->gilstate_counter;
   1076 
   1077     if (need_init_threads) {
   1078         /* At startup, Python has no concrete GIL. If PyGILState_Ensure() is
   1079            called from a new thread for the first time, we need the create the
   1080            GIL. */
   1081         PyEval_InitThreads();
   1082     }
   1083 
   1084     return current ? PyGILState_LOCKED : PyGILState_UNLOCKED;
   1085 }
   1086 
   1087 void
   1088 PyGILState_Release(PyGILState_STATE oldstate)
   1089 {
   1090     PyThreadState *tcur = (PyThreadState *)PyThread_tss_get(
   1091                                 &_PyRuntime.gilstate.autoTSSkey);
   1092     if (tcur == NULL)
   1093         Py_FatalError("auto-releasing thread-state, "
   1094                       "but no thread-state for this thread");
   1095     /* We must hold the GIL and have our thread state current */
   1096     /* XXX - remove the check - the assert should be fine,
   1097        but while this is very new (April 2003), the extra check
   1098        by release-only users can't hurt.
   1099     */
   1100     if (! PyThreadState_IsCurrent(tcur))
   1101         Py_FatalError("This thread state must be current when releasing");
   1102     assert(PyThreadState_IsCurrent(tcur));
   1103     --tcur->gilstate_counter;
   1104     assert(tcur->gilstate_counter >= 0); /* illegal counter value */
   1105 
   1106     /* If we're going to destroy this thread-state, we must
   1107      * clear it while the GIL is held, as destructors may run.
   1108      */
   1109     if (tcur->gilstate_counter == 0) {
   1110         /* can't have been locked when we created it */
   1111         assert(oldstate == PyGILState_UNLOCKED);
   1112         PyThreadState_Clear(tcur);
   1113         /* Delete the thread-state.  Note this releases the GIL too!
   1114          * It's vital that the GIL be held here, to avoid shutdown
   1115          * races; see bugs 225673 and 1061968 (that nasty bug has a
   1116          * habit of coming back).
   1117          */
   1118         PyThreadState_DeleteCurrent();
   1119     }
   1120     /* Release the lock if necessary */
   1121     else if (oldstate == PyGILState_UNLOCKED)
   1122         PyEval_SaveThread();
   1123 }
   1124 
   1125 
   1126 #ifdef __cplusplus
   1127 }
   1128 #endif
   1129