diff options
author | Joannah Nanjekye <33177550+nanjekyejoannah@users.noreply.github.com> | 2019-09-05 16:06:49 (GMT) |
---|---|---|
committer | Victor Stinner <vstinner@redhat.com> | 2019-09-05 16:06:49 (GMT) |
commit | 2bc43cdc015eda4f1a651bb2b308a17a83c38e14 (patch) | |
tree | 1a3a998656035eedb1e30c033f7fc3bb3156cdd9 | |
parent | 2c2b561967c1916855399f809e30ae0ba7e09ae2 (diff) | |
download | cpython-2bc43cdc015eda4f1a651bb2b308a17a83c38e14.zip cpython-2bc43cdc015eda4f1a651bb2b308a17a83c38e14.tar.gz cpython-2bc43cdc015eda4f1a651bb2b308a17a83c38e14.tar.bz2 |
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>
-rw-r--r-- | Doc/whatsnew/3.9.rst | 3 | ||||
-rw-r--r-- | Include/internal/pycore_pylifecycle.h | 2 | ||||
-rw-r--r-- | Include/pystate.h | 1 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Documentation/2019-08-16-20-01-10.bpo-37878.MvA6rZ.rst | 1 | ||||
-rw-r--r-- | Modules/_threadmodule.c | 9 | ||||
-rw-r--r-- | Modules/_tracemalloc.c | 4 | ||||
-rw-r--r-- | Python/pystate.c | 12 |
7 files changed, 18 insertions, 14 deletions
diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index 009a66a..756690d 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -219,6 +219,9 @@ Removed standard :class:`bytes` objects are always used. (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 ===================== diff --git a/Include/internal/pycore_pylifecycle.h b/Include/internal/pycore_pylifecycle.h index 7ea4488..cf844cc 100644 --- a/Include/internal/pycore_pylifecycle.h +++ b/Include/internal/pycore_pylifecycle.h @@ -110,6 +110,8 @@ PyAPI_FUNC(void) _PyErr_Print(PyThreadState *tstate); PyAPI_FUNC(void) _PyErr_Display(PyObject *file, PyObject *exception, PyObject *value, PyObject *tb); +PyAPI_FUNC(void) _PyThreadState_DeleteCurrent(_PyRuntimeState *runtime); + #ifdef __cplusplus } #endif diff --git a/Include/pystate.h b/Include/pystate.h index 4c25e3f..1cb2305 100644 --- a/Include/pystate.h +++ b/Include/pystate.h @@ -50,7 +50,6 @@ PyAPI_FUNC(PyObject*) PyState_FindModule(struct PyModuleDef*); PyAPI_FUNC(PyThreadState *) PyThreadState_New(PyInterpreterState *); PyAPI_FUNC(void) PyThreadState_Clear(PyThreadState *); PyAPI_FUNC(void) PyThreadState_Delete(PyThreadState *); -PyAPI_FUNC(void) PyThreadState_DeleteCurrent(void); /* Get the current thread state. diff --git a/Misc/NEWS.d/next/Documentation/2019-08-16-20-01-10.bpo-37878.MvA6rZ.rst b/Misc/NEWS.d/next/Documentation/2019-08-16-20-01-10.bpo-37878.MvA6rZ.rst new file mode 100644 index 0000000..8da4eb9 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2019-08-16-20-01-10.bpo-37878.MvA6rZ.rst @@ -0,0 +1 @@ +Make :c:func:`PyThreadState_DeleteCurrent` Internal. diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c index a3ecd2e..1c7df3f 100644 --- a/Modules/_threadmodule.c +++ b/Modules/_threadmodule.c @@ -993,6 +993,7 @@ struct bootstate { PyObject *args; PyObject *keyw; PyThreadState *tstate; + _PyRuntimeState *runtime; }; static void @@ -1000,11 +1001,13 @@ t_bootstrap(void *boot_raw) { struct bootstate *boot = (struct bootstate *) boot_raw; PyThreadState *tstate; + _PyRuntimeState *runtime; PyObject *res; + runtime = boot->runtime; tstate = boot->tstate; tstate->thread_id = PyThread_get_thread_ident(); - _PyThreadState_Init(&_PyRuntime, tstate); + _PyThreadState_Init(runtime, tstate); PyEval_AcquireThread(tstate); tstate->interp->num_threads++; res = PyObject_Call(boot->func, boot->args, boot->keyw); @@ -1025,13 +1028,14 @@ t_bootstrap(void *boot_raw) PyMem_DEL(boot_raw); tstate->interp->num_threads--; PyThreadState_Clear(tstate); - PyThreadState_DeleteCurrent(); + _PyThreadState_DeleteCurrent(runtime); PyThread_exit_thread(); } static PyObject * thread_PyThread_start_new_thread(PyObject *self, PyObject *fargs) { + _PyRuntimeState *runtime = &_PyRuntime; PyObject *func, *args, *keyw = NULL; struct bootstate *boot; unsigned long ident; @@ -1062,6 +1066,7 @@ thread_PyThread_start_new_thread(PyObject *self, PyObject *fargs) boot->args = args; boot->keyw = keyw; boot->tstate = _PyThreadState_Prealloc(boot->interp); + boot->runtime = runtime; if (boot->tstate == NULL) { PyMem_DEL(boot); return PyErr_NoMemory(); diff --git a/Modules/_tracemalloc.c b/Modules/_tracemalloc.c index ee32ac2..26d7600 100644 --- a/Modules/_tracemalloc.c +++ b/Modules/_tracemalloc.c @@ -34,7 +34,7 @@ static struct { #if defined(TRACE_RAW_MALLOC) /* This lock is needed because tracemalloc_free() is called without 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; # define TABLES_LOCK() PyThread_acquire_lock(tables_lock, 1) # define TABLES_UNLOCK() PyThread_release_lock(tables_lock) @@ -728,7 +728,7 @@ tracemalloc_free(void *ctx, void *ptr) return; /* 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); diff --git a/Python/pystate.c b/Python/pystate.c index dc52400..02bc903 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -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 tstate_delete_common(_PyRuntimeState *runtime, PyThreadState *tstate) { @@ -858,14 +858,14 @@ PyThreadState_Delete(PyThreadState *tstate) } -static void +void _PyThreadState_DeleteCurrent(_PyRuntimeState *runtime) { struct _gilstate_runtime_state *gilstate = &runtime->gilstate; PyThreadState *tstate = _PyRuntimeGILState_GetThreadState(gilstate); if (tstate == NULL) Py_FatalError( - "PyThreadState_DeleteCurrent: no current tstate"); + "_PyThreadState_DeleteCurrent: no current tstate"); tstate_delete_common(runtime, tstate); if (gilstate->autoInterpreterState && PyThread_tss_get(&gilstate->autoTSSkey) == tstate) @@ -876,12 +876,6 @@ _PyThreadState_DeleteCurrent(_PyRuntimeState *runtime) PyEval_ReleaseLock(); } -void -PyThreadState_DeleteCurrent() -{ - _PyThreadState_DeleteCurrent(&_PyRuntime); -} - /* * Delete all thread states except the one passed as argument. |