summaryrefslogtreecommitdiffstats
path: root/Python
diff options
context:
space:
mode:
authorSam Gross <colesbury@gmail.com>2024-01-04 22:21:40 (GMT)
committerGitHub <noreply@github.com>2024-01-04 22:21:40 (GMT)
commitfcb3c2a444709d2a53faa20c5b43541674064018 (patch)
treec0d5d58c179a2e7d5dd1c234360c6afdb8beaf42 /Python
parentc2e8298eba3f8d75a58e5b3636f8edc8d60e68da (diff)
downloadcpython-fcb3c2a444709d2a53faa20c5b43541674064018.zip
cpython-fcb3c2a444709d2a53faa20c5b43541674064018.tar.gz
cpython-fcb3c2a444709d2a53faa20c5b43541674064018.tar.bz2
gh-112532: Isolate abandoned segments by interpreter (#113717)
* gh-112532: Isolate abandoned segments by interpreter Mimalloc segments are data structures that contain memory allocations along with metadata. Each segment is "owned" by a thread. When a thread exits, it abandons its segments to a global pool to be later reclaimed by other threads. This changes the pool to be per-interpreter instead of process-wide. This will be important for when we use mimalloc to find GC objects in the `--disable-gil` builds. We want heaps to only store Python objects from a single interpreter. Absent this change, the abandoning and reclaiming process could break this isolation. * Add missing '&_mi_abandoned_default' to 'tld_empty'
Diffstat (limited to 'Python')
-rw-r--r--Python/pystate.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/Python/pystate.c b/Python/pystate.c
index 84e2d6e..5f515cf 100644
--- a/Python/pystate.c
+++ b/Python/pystate.c
@@ -2533,6 +2533,11 @@ tstate_mimalloc_bind(PyThreadState *tstate)
mi_tld_t *tld = &mts->tld;
_mi_tld_init(tld, &mts->heaps[_Py_MIMALLOC_HEAP_MEM]);
+ // Exiting threads push any remaining in-use segments to the abandoned
+ // pool to be re-claimed later by other threads. We use per-interpreter
+ // pools to keep Python objects from different interpreters separate.
+ tld->segments.abandoned = &tstate->interp->mimalloc.abandoned_pool;
+
// Initialize each heap
for (Py_ssize_t i = 0; i < _Py_MIMALLOC_HEAP_COUNT; i++) {
_mi_heap_init_ex(&mts->heaps[i], tld, _mi_arena_id_none());