summaryrefslogtreecommitdiffstats
path: root/Python
diff options
context:
space:
mode:
authorDonghee Na <donghee.na@python.org>2024-02-10 00:57:04 (GMT)
committerGitHub <noreply@github.com>2024-02-10 00:57:04 (GMT)
commitd4d5bae1471788b345155e8e93a2fe4ab92d09dc (patch)
tree989f7efdc60aff606679d12b4f1853174dd4365d /Python
parent564385612cdf72c2fa8e629a68225fb2cd3b3d99 (diff)
downloadcpython-d4d5bae1471788b345155e8e93a2fe4ab92d09dc.zip
cpython-d4d5bae1471788b345155e8e93a2fe4ab92d09dc.tar.gz
cpython-d4d5bae1471788b345155e8e93a2fe4ab92d09dc.tar.bz2
gh-111968: Refactor _PyXXX_Fini to integrate with _PyObject_ClearFreeLists (gh-114899)
Diffstat (limited to 'Python')
-rw-r--r--Python/context.c11
-rw-r--r--Python/gc_free_threading.c2
-rw-r--r--Python/gc_gil.c2
-rw-r--r--Python/pylifecycle.c12
-rw-r--r--Python/pystate.c19
5 files changed, 9 insertions, 37 deletions
diff --git a/Python/context.c b/Python/context.c
index 793dfa2..e44fef7 100644
--- a/Python/context.c
+++ b/Python/context.c
@@ -1284,17 +1284,6 @@ _PyContext_ClearFreeList(_PyFreeListState *freelist_state, int is_finalization)
}
-void
-_PyContext_Fini(_PyFreeListState *state)
-{
- // With Py_GIL_DISABLED:
- // the freelists for the current thread state have already been cleared.
-#ifndef Py_GIL_DISABLED
- _PyContext_ClearFreeList(state, 1);
-#endif
-}
-
-
PyStatus
_PyContext_Init(PyInterpreterState *interp)
{
diff --git a/Python/gc_free_threading.c b/Python/gc_free_threading.c
index 5d3b097..93e1168 100644
--- a/Python/gc_free_threading.c
+++ b/Python/gc_free_threading.c
@@ -1721,7 +1721,7 @@ _PyGC_ClearAllFreeLists(PyInterpreterState *interp)
HEAD_LOCK(&_PyRuntime);
_PyThreadStateImpl *tstate = (_PyThreadStateImpl *)interp->threads.head;
while (tstate != NULL) {
- _Py_ClearFreeLists(&tstate->freelist_state, 0);
+ _PyObject_ClearFreeLists(&tstate->freelist_state, 0);
tstate = (_PyThreadStateImpl *)tstate->base.next;
}
HEAD_UNLOCK(&_PyRuntime);
diff --git a/Python/gc_gil.c b/Python/gc_gil.c
index 4e2aa8f..5f1365f 100644
--- a/Python/gc_gil.c
+++ b/Python/gc_gil.c
@@ -11,7 +11,7 @@
void
_PyGC_ClearAllFreeLists(PyInterpreterState *interp)
{
- _Py_ClearFreeLists(&interp->freelist_state, 0);
+ _PyObject_ClearFreeLists(&interp->freelist_state, 0);
}
#endif
diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c
index 0cac710..61c9d4f 100644
--- a/Python/pylifecycle.c
+++ b/Python/pylifecycle.c
@@ -1790,16 +1790,14 @@ finalize_interp_types(PyInterpreterState *interp)
// a dict internally.
_PyUnicode_ClearInterned(interp);
- _PyDict_Fini(interp);
_PyUnicode_Fini(interp);
+#ifndef Py_GIL_DISABLED
+ // With Py_GIL_DISABLED:
+ // the freelists for the current thread state have already been cleared.
_PyFreeListState *state = _PyFreeListState_GET();
- _PyTuple_Fini(state);
- _PyList_Fini(state);
- _PyFloat_Fini(state);
- _PySlice_Fini(state);
- _PyContext_Fini(state);
- _PyAsyncGen_Fini(state);
+ _PyObject_ClearFreeLists(state, 1);
+#endif
#ifdef Py_DEBUG
_PyStaticObjects_CheckRefcnt(interp);
diff --git a/Python/pystate.c b/Python/pystate.c
index 6cd0347..937c430 100644
--- a/Python/pystate.c
+++ b/Python/pystate.c
@@ -1469,20 +1469,6 @@ clear_datastack(PyThreadState *tstate)
}
void
-_Py_ClearFreeLists(_PyFreeListState *state, int is_finalization)
-{
- // In the free-threaded build, freelists are per-PyThreadState and cleared in PyThreadState_Clear()
- // In the default build, freelists are per-interpreter and cleared in finalize_interp_types()
- _PyFloat_ClearFreeList(state, is_finalization);
- _PyTuple_ClearFreeList(state, is_finalization);
- _PyList_ClearFreeList(state, is_finalization);
- _PyDict_ClearFreeList(state, is_finalization);
- _PyContext_ClearFreeList(state, is_finalization);
- _PyAsyncGen_ClearFreeLists(state, is_finalization);
- _PyObjectStackChunk_ClearFreeList(state, is_finalization);
-}
-
-void
PyThreadState_Clear(PyThreadState *tstate)
{
assert(tstate->_status.initialized && !tstate->_status.cleared);
@@ -1566,9 +1552,8 @@ PyThreadState_Clear(PyThreadState *tstate)
}
#ifdef Py_GIL_DISABLED
// Each thread should clear own freelists in free-threading builds.
- _PyFreeListState *freelist_state = &((_PyThreadStateImpl*)tstate)->freelist_state;
- _Py_ClearFreeLists(freelist_state, 1);
- _PySlice_ClearCache(freelist_state);
+ _PyFreeListState *freelist_state = _PyFreeListState_GET();
+ _PyObject_ClearFreeLists(freelist_state, 1);
// Remove ourself from the biased reference counting table of threads.
_Py_brc_remove_thread(tstate);