--- a PPN by Garber Painting Akron. With Image Size Reduction included!URL: http://github.com/python/cpython/pull/113584.diff
getcopyright.c" />
diff --git a/PCbuild/_freeze_module.vcxproj.filters b/PCbuild/_freeze_module.vcxproj.filters
index 7f03cfea1b3e6f..3141913c043869 100644
--- a/PCbuild/_freeze_module.vcxproj.filters
+++ b/PCbuild/_freeze_module.vcxproj.filters
@@ -169,6 +169,12 @@
Source Files
+
+ Source Files
+
+
+ Source Files
+
Source Files
diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj
index 163adfdc51c6a8..12635e2ffdfc34 100644
--- a/PCbuild/pythoncore.vcxproj
+++ b/PCbuild/pythoncore.vcxproj
@@ -231,6 +231,7 @@
+
@@ -567,6 +568,8 @@
+
+
diff --git a/PCbuild/pythoncore.vcxproj.filters b/PCbuild/pythoncore.vcxproj.filters
index a45a0881f7113d..5ae7e0d75c7135 100644
--- a/PCbuild/pythoncore.vcxproj.filters
+++ b/PCbuild/pythoncore.vcxproj.filters
@@ -618,6 +618,12 @@
Include\internal
+
+ Include\internal
+
+
+ Include\internal
+
Include\internal
@@ -1283,6 +1289,12 @@
Python
+
+ Python
+
+
+ Python
+
Python
diff --git a/Python/gc.c b/Python/gc.c
index f47c74f87a9166..9f9a755f6ac95e 100644
--- a/Python/gc.c
+++ b/Python/gc.c
@@ -1019,21 +1019,6 @@ delete_garbage(PyThreadState *tstate, GCState *gcstate,
}
}
-/* Clear all free lists
- * All free lists are cleared during the collection of the highest generation.
- * Allocated items in the free list may keep a pymalloc arena occupied.
- * Clearing the free lists may give back memory to the OS earlier.
- */
-static void
-clear_freelists(PyInterpreterState *interp)
-{
- _PyTuple_ClearFreeList(interp);
- _PyFloat_ClearFreeList(interp);
- _PyList_ClearFreeList(interp);
- _PyDict_ClearFreeList(interp);
- _PyAsyncGen_ClearFreeLists(interp);
- _PyContext_ClearFreeList(interp);
-}
// Show stats for objects in each generations
static void
@@ -1449,7 +1434,7 @@ gc_collect_main(PyThreadState *tstate, int generation, _PyGC_Reason reason)
/* Clear free list only during the collection of the highest
* generation */
if (generation == NUM_GENERATIONS-1) {
- clear_freelists(tstate->interp);
+ _PyGC_ClearAllFreeLists(tstate->interp);
}
if (_PyErr_Occurred(tstate)) {
diff --git a/Python/gc_free_threading.c b/Python/gc_free_threading.c
new file mode 100644
index 00000000000000..aea272840f950d
--- /dev/null
+++ b/Python/gc_free_threading.c
@@ -0,0 +1,32 @@
+#include "Python.h"
+#include "pycore_pystate.h" // _PyFreeListState_GET()
+#include "pycore_tstate.h" // _PyThreadStateImpl
+
+#ifdef Py_GIL_DISABLED
+
+/* Clear all free lists
+ * All free lists are cleared during the collection of the highest generation.
+ * Allocated items in the free list may keep a pymalloc arena occupied.
+ * Clearing the free lists may give back memory to the OS earlier.
+ * Free-threading version: Since freelists are managed per thread,
+ * GC should clear all freelists by traversing all threads.
+ */
+void
+_PyGC_ClearAllFreeLists(PyInterpreterState *interp)
+{
+ _PyTuple_ClearFreeList(interp);
+ _PyFloat_ClearFreeList(interp);
+ _PyDict_ClearFreeList(interp);
+ _PyAsyncGen_ClearFreeLists(interp);
+ _PyContext_ClearFreeList(interp);
+
+ HEAD_LOCK(&_PyRuntime);
+ _PyThreadStateImpl *tstate = (_PyThreadStateImpl *)interp->threads.head;
+ while (tstate != NULL) {
+ _Py_ClearFreeLists(&tstate->freelist_state, 0);
+ tstate = (_PyThreadStateImpl *)tstate->base.next;
+ }
+ HEAD_UNLOCK(&_PyRuntime);
+}
+
+#endif
diff --git a/Python/gc_gil.c b/Python/gc_gil.c
new file mode 100644
index 00000000000000..b0961cdbee904f
--- /dev/null
+++ b/Python/gc_gil.c
@@ -0,0 +1,23 @@
+#include "Python.h"
+#include "pycore_pystate.h" // _Py_ClearFreeLists()
+
+#ifndef Py_GIL_DISABLED
+
+/* Clear all free lists
+ * All free lists are cleared during the collection of the highest generation.
+ * Allocated items in the free list may keep a pymalloc arena occupied.
+ * Clearing the free lists may give back memory to the OS earlier.
+ */
+void
+_PyGC_ClearAllFreeLists(PyInterpreterState *interp)
+{
+ _PyTuple_ClearFreeList(interp);
+ _PyFloat_ClearFreeList(interp);
+ _PyDict_ClearFreeList(interp);
+ _PyAsyncGen_ClearFreeLists(interp);
+ _PyContext_ClearFreeList(interp);
+
+ _Py_ClearFreeLists(&interp->freelist_state, 0);
+}
+
+#endif
diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c
index 1d8af26e4a1cb7..bd6475f99e464b 100644
--- a/Python/pylifecycle.c
+++ b/Python/pylifecycle.c
@@ -1752,13 +1752,16 @@ finalize_interp_types(PyInterpreterState *interp)
_PyUnicode_ClearInterned(interp);
_PyDict_Fini(interp);
- _PyList_Fini(interp);
_PyTuple_Fini(interp);
_PySlice_Fini(interp);
_PyUnicode_Fini(interp);
_PyFloat_Fini(interp);
+
+ _PyFreeListState *state = _PyFreeListState_GET();
+ _PyList_Fini(state);
+
#ifdef Py_DEBUG
_PyStaticObjects_CheckRefcnt(interp);
#endif
diff --git a/Python/pystate.c b/Python/pystate.c
index 21f16b7bcdff0d..ddd57f75f3f363 100644
--- a/Python/pystate.c
+++ b/Python/pystate.c
@@ -1455,6 +1455,12 @@ clear_datastack(PyThreadState *tstate)
}
}
+void
+_Py_ClearFreeLists(_PyFreeListState *state, int is_finalization)
+{
+ _PyList_ClearFreeList(state, is_finalization);
+}
+
void
PyThreadState_Clear(PyThreadState *tstate)
{
@@ -1537,6 +1543,11 @@ PyThreadState_Clear(PyThreadState *tstate)
// don't call _PyInterpreterState_SetNotRunningMain() yet.
tstate->on_delete(tstate->on_delete_data);
}
+#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, 0);
+#endif
_PyThreadState_ClearMimallocHeaps(tstate);
pFad - Phonifier reborn
Pfad - The Proxy pFad © 2024 Your Company Name. All rights reserved.
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies:
Alternative Proxy
pFad Proxy
pFad v3 Proxy
pFad v4 Proxy