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:
Joannah Nanjekye 2019-09-05 13:06:49 -03:00 committed by Victor Stinner
parent 2c2b561967
commit 2bc43cdc01
7 changed files with 18 additions and 14 deletions

View File

@ -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
===================== =====================

View File

@ -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

View File

@ -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.

View File

@ -0,0 +1 @@
Make :c:func:`PyThreadState_DeleteCurrent` Internal.

View File

@ -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();

View File

@ -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);

View File

@ -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.