mirror of
https://github.com/python/cpython.git
synced 2026-04-13 23:31:02 +00:00
Fix three issues that caused mimalloc pages to be leaked until the owning thread exited: 1. In _PyMem_mi_page_maybe_free(), move pages out of the full queue when relying on QSBR to defer freeing the page. Pages in the full queue are never searched by mi_page_queue_find_free_ex(), so a page left there is unusable for allocations. 2. Move _PyMem_mi_page_clear_qsbr() from _mi_page_free_collect() to _mi_page_thread_free_collect() where it only fires when all blocks on the page are free (used == 0). The previous placement was too broad: it cleared QSBR state whenever local_free was non-NULL, but _mi_page_free_collect() is called from non-allocation paths (e.g., page visiting in mi_heap_visit_blocks) where the page is not being reused. 3. In _PyMem_mi_page_maybe_free(), use the page's heap tld to find the correct thread state for QSBR list insertion instead of PyThreadState_GET(). During stop-the-world pauses, the function may process pages belonging to other threads, so the current thread state is not necessarily the owner of the page. |
||
|---|---|---|
| .. | ||
| prim | ||
| alloc-aligned.c | ||
| alloc-override.c | ||
| alloc-posix.c | ||
| alloc.c | ||
| arena.c | ||
| bitmap.c | ||
| bitmap.h | ||
| heap.c | ||
| init.c | ||
| options.c | ||
| os.c | ||
| page-queue.c | ||
| page.c | ||
| random.c | ||
| segment-map.c | ||
| segment.c | ||
| static.c | ||
| stats.c | ||