summaryrefslogtreecommitdiffstats
path: root/Python
diff options
context:
space:
mode:
Diffstat (limited to 'Python')
-rw-r--r--Python/context.c4
-rw-r--r--Python/gc_free_threading.c2
-rw-r--r--Python/gc_gil.c2
-rw-r--r--Python/pystate.c3
4 files changed, 7 insertions, 4 deletions
diff --git a/Python/context.c b/Python/context.c
index 294485e..793dfa2 100644
--- a/Python/context.c
+++ b/Python/context.c
@@ -1287,7 +1287,11 @@ _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
}
diff --git a/Python/gc_free_threading.c b/Python/gc_free_threading.c
index 53f927b..8fbcdb1 100644
--- a/Python/gc_free_threading.c
+++ b/Python/gc_free_threading.c
@@ -1676,8 +1676,6 @@ PyUnstable_GC_VisitObjects(gcvisitobjects_t callback, void *arg)
void
_PyGC_ClearAllFreeLists(PyInterpreterState *interp)
{
- _PyDict_ClearFreeList(interp);
-
HEAD_LOCK(&_PyRuntime);
_PyThreadStateImpl *tstate = (_PyThreadStateImpl *)interp->threads.head;
while (tstate != NULL) {
diff --git a/Python/gc_gil.c b/Python/gc_gil.c
index 04c1c18..4e2aa8f 100644
--- a/Python/gc_gil.c
+++ b/Python/gc_gil.c
@@ -11,8 +11,6 @@
void
_PyGC_ClearAllFreeLists(PyInterpreterState *interp)
{
- _PyDict_ClearFreeList(interp);
-
_Py_ClearFreeLists(&interp->freelist_state, 0);
}
diff --git a/Python/pystate.c b/Python/pystate.c
index 430121a..27b6d05 100644
--- a/Python/pystate.c
+++ b/Python/pystate.c
@@ -1461,9 +1461,12 @@ 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);