bpo-37878: Remove PyThreadState_DeleteCurrent() function (GH-15315)
* Rename PyThreadState_DeleteCurrent() to _PyThreadState_DeleteCurrent() * Move it to the internal C API Co-Authored-By: Carol Willing <carolcode@willingconsulting.com>
This commit is contained in:
parent
2c2b561967
commit
2bc43cdc01
|
@ -219,6 +219,9 @@ Removed
|
||||||
standard :class:`bytes` objects are always used.
|
standard :class:`bytes` objects are always used.
|
||||||
(Contributed by Jon Janzen in :issue:`36409`.)
|
(Contributed by Jon Janzen in :issue:`36409`.)
|
||||||
|
|
||||||
|
* ``PyThreadState_DeleteCurrent()`` has been removed. It was not documented.
|
||||||
|
(Contributed by Joannah Nanjekye in :issue:`37878`.)
|
||||||
|
|
||||||
|
|
||||||
Porting to Python 3.9
|
Porting to Python 3.9
|
||||||
=====================
|
=====================
|
||||||
|
|
|
@ -110,6 +110,8 @@ PyAPI_FUNC(void) _PyErr_Print(PyThreadState *tstate);
|
||||||
PyAPI_FUNC(void) _PyErr_Display(PyObject *file, PyObject *exception,
|
PyAPI_FUNC(void) _PyErr_Display(PyObject *file, PyObject *exception,
|
||||||
PyObject *value, PyObject *tb);
|
PyObject *value, PyObject *tb);
|
||||||
|
|
||||||
|
PyAPI_FUNC(void) _PyThreadState_DeleteCurrent(_PyRuntimeState *runtime);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -50,7 +50,6 @@ PyAPI_FUNC(PyObject*) PyState_FindModule(struct PyModuleDef*);
|
||||||
PyAPI_FUNC(PyThreadState *) PyThreadState_New(PyInterpreterState *);
|
PyAPI_FUNC(PyThreadState *) PyThreadState_New(PyInterpreterState *);
|
||||||
PyAPI_FUNC(void) PyThreadState_Clear(PyThreadState *);
|
PyAPI_FUNC(void) PyThreadState_Clear(PyThreadState *);
|
||||||
PyAPI_FUNC(void) PyThreadState_Delete(PyThreadState *);
|
PyAPI_FUNC(void) PyThreadState_Delete(PyThreadState *);
|
||||||
PyAPI_FUNC(void) PyThreadState_DeleteCurrent(void);
|
|
||||||
|
|
||||||
/* Get the current thread state.
|
/* Get the current thread state.
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Make :c:func:`PyThreadState_DeleteCurrent` Internal.
|
|
@ -993,6 +993,7 @@ struct bootstate {
|
||||||
PyObject *args;
|
PyObject *args;
|
||||||
PyObject *keyw;
|
PyObject *keyw;
|
||||||
PyThreadState *tstate;
|
PyThreadState *tstate;
|
||||||
|
_PyRuntimeState *runtime;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -1000,11 +1001,13 @@ t_bootstrap(void *boot_raw)
|
||||||
{
|
{
|
||||||
struct bootstate *boot = (struct bootstate *) boot_raw;
|
struct bootstate *boot = (struct bootstate *) boot_raw;
|
||||||
PyThreadState *tstate;
|
PyThreadState *tstate;
|
||||||
|
_PyRuntimeState *runtime;
|
||||||
PyObject *res;
|
PyObject *res;
|
||||||
|
|
||||||
|
runtime = boot->runtime;
|
||||||
tstate = boot->tstate;
|
tstate = boot->tstate;
|
||||||
tstate->thread_id = PyThread_get_thread_ident();
|
tstate->thread_id = PyThread_get_thread_ident();
|
||||||
_PyThreadState_Init(&_PyRuntime, tstate);
|
_PyThreadState_Init(runtime, tstate);
|
||||||
PyEval_AcquireThread(tstate);
|
PyEval_AcquireThread(tstate);
|
||||||
tstate->interp->num_threads++;
|
tstate->interp->num_threads++;
|
||||||
res = PyObject_Call(boot->func, boot->args, boot->keyw);
|
res = PyObject_Call(boot->func, boot->args, boot->keyw);
|
||||||
|
@ -1025,13 +1028,14 @@ t_bootstrap(void *boot_raw)
|
||||||
PyMem_DEL(boot_raw);
|
PyMem_DEL(boot_raw);
|
||||||
tstate->interp->num_threads--;
|
tstate->interp->num_threads--;
|
||||||
PyThreadState_Clear(tstate);
|
PyThreadState_Clear(tstate);
|
||||||
PyThreadState_DeleteCurrent();
|
_PyThreadState_DeleteCurrent(runtime);
|
||||||
PyThread_exit_thread();
|
PyThread_exit_thread();
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
thread_PyThread_start_new_thread(PyObject *self, PyObject *fargs)
|
thread_PyThread_start_new_thread(PyObject *self, PyObject *fargs)
|
||||||
{
|
{
|
||||||
|
_PyRuntimeState *runtime = &_PyRuntime;
|
||||||
PyObject *func, *args, *keyw = NULL;
|
PyObject *func, *args, *keyw = NULL;
|
||||||
struct bootstate *boot;
|
struct bootstate *boot;
|
||||||
unsigned long ident;
|
unsigned long ident;
|
||||||
|
@ -1062,6 +1066,7 @@ thread_PyThread_start_new_thread(PyObject *self, PyObject *fargs)
|
||||||
boot->args = args;
|
boot->args = args;
|
||||||
boot->keyw = keyw;
|
boot->keyw = keyw;
|
||||||
boot->tstate = _PyThreadState_Prealloc(boot->interp);
|
boot->tstate = _PyThreadState_Prealloc(boot->interp);
|
||||||
|
boot->runtime = runtime;
|
||||||
if (boot->tstate == NULL) {
|
if (boot->tstate == NULL) {
|
||||||
PyMem_DEL(boot);
|
PyMem_DEL(boot);
|
||||||
return PyErr_NoMemory();
|
return PyErr_NoMemory();
|
||||||
|
|
|
@ -34,7 +34,7 @@ static struct {
|
||||||
#if defined(TRACE_RAW_MALLOC)
|
#if defined(TRACE_RAW_MALLOC)
|
||||||
/* This lock is needed because tracemalloc_free() is called without
|
/* This lock is needed because tracemalloc_free() is called without
|
||||||
the GIL held from PyMem_RawFree(). It cannot acquire the lock because it
|
the GIL held from PyMem_RawFree(). It cannot acquire the lock because it
|
||||||
would introduce a deadlock in PyThreadState_DeleteCurrent(). */
|
would introduce a deadlock in _PyThreadState_DeleteCurrent(). */
|
||||||
static PyThread_type_lock tables_lock;
|
static PyThread_type_lock tables_lock;
|
||||||
# define TABLES_LOCK() PyThread_acquire_lock(tables_lock, 1)
|
# define TABLES_LOCK() PyThread_acquire_lock(tables_lock, 1)
|
||||||
# define TABLES_UNLOCK() PyThread_release_lock(tables_lock)
|
# define TABLES_UNLOCK() PyThread_release_lock(tables_lock)
|
||||||
|
@ -728,7 +728,7 @@ tracemalloc_free(void *ctx, void *ptr)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* GIL cannot be locked in PyMem_RawFree() because it would introduce
|
/* GIL cannot be locked in PyMem_RawFree() because it would introduce
|
||||||
a deadlock in PyThreadState_DeleteCurrent(). */
|
a deadlock in _PyThreadState_DeleteCurrent(). */
|
||||||
|
|
||||||
alloc->free(alloc->ctx, ptr);
|
alloc->free(alloc->ctx, ptr);
|
||||||
|
|
||||||
|
|
|
@ -809,7 +809,7 @@ PyThreadState_Clear(PyThreadState *tstate)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Common code for PyThreadState_Delete() and PyThreadState_DeleteCurrent() */
|
/* Common code for PyThreadState_Delete() and _PyThreadState_DeleteCurrent() */
|
||||||
static void
|
static void
|
||||||
tstate_delete_common(_PyRuntimeState *runtime, PyThreadState *tstate)
|
tstate_delete_common(_PyRuntimeState *runtime, PyThreadState *tstate)
|
||||||
{
|
{
|
||||||
|
@ -858,14 +858,14 @@ PyThreadState_Delete(PyThreadState *tstate)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
void
|
||||||
_PyThreadState_DeleteCurrent(_PyRuntimeState *runtime)
|
_PyThreadState_DeleteCurrent(_PyRuntimeState *runtime)
|
||||||
{
|
{
|
||||||
struct _gilstate_runtime_state *gilstate = &runtime->gilstate;
|
struct _gilstate_runtime_state *gilstate = &runtime->gilstate;
|
||||||
PyThreadState *tstate = _PyRuntimeGILState_GetThreadState(gilstate);
|
PyThreadState *tstate = _PyRuntimeGILState_GetThreadState(gilstate);
|
||||||
if (tstate == NULL)
|
if (tstate == NULL)
|
||||||
Py_FatalError(
|
Py_FatalError(
|
||||||
"PyThreadState_DeleteCurrent: no current tstate");
|
"_PyThreadState_DeleteCurrent: no current tstate");
|
||||||
tstate_delete_common(runtime, tstate);
|
tstate_delete_common(runtime, tstate);
|
||||||
if (gilstate->autoInterpreterState &&
|
if (gilstate->autoInterpreterState &&
|
||||||
PyThread_tss_get(&gilstate->autoTSSkey) == tstate)
|
PyThread_tss_get(&gilstate->autoTSSkey) == tstate)
|
||||||
|
@ -876,12 +876,6 @@ _PyThreadState_DeleteCurrent(_PyRuntimeState *runtime)
|
||||||
PyEval_ReleaseLock();
|
PyEval_ReleaseLock();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
PyThreadState_DeleteCurrent()
|
|
||||||
{
|
|
||||||
_PyThreadState_DeleteCurrent(&_PyRuntime);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Delete all thread states except the one passed as argument.
|
* Delete all thread states except the one passed as argument.
|
||||||
|
|
Loading…
Reference in New Issue