From 44c867aa21403c061c4ebe4eebc53bed210dd893 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Wed, 9 Apr 2025 13:39:57 +0200 Subject: [PATCH 1/4] free-threaded build: fix compile-time invalid function pointers --- Python/gc_free_threading.c | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/Python/gc_free_threading.c b/Python/gc_free_threading.c index 4c459b02ce2b8f..fa4cb56f01e800 100644 --- a/Python/gc_free_threading.c +++ b/Python/gc_free_threading.c @@ -688,6 +688,12 @@ gc_mark_enqueue_no_buffer(PyObject *op, gc_mark_args_t *args) return 0; } +static inline int +gc_mark_enqueue_no_buffer_visitproc(PyObject *op, void *args) +{ + return gc_mark_enqueue_no_buffer(op, (gc_mark_args_t *)args); +} + static int gc_mark_enqueue_buffer(PyObject *op, gc_mark_args_t *args) { @@ -701,6 +707,12 @@ gc_mark_enqueue_buffer(PyObject *op, gc_mark_args_t *args) } } +static inline int +gc_mark_enqueue_buffer_visitproc(PyObject *op, void *args) +{ + return gc_mark_enqueue_buffer(op, (gc_mark_args_t *)args); +} + // Called when we find an object that needs to be marked alive (either from a // root or from calling tp_traverse). static int @@ -986,12 +998,12 @@ update_refs(const mi_heap_t *heap, const mi_heap_area_t *area, } static int -visit_clear_unreachable(PyObject *op, _PyObjectStack *stack) +visit_clear_unreachable(PyObject *op, void *stack) { if (gc_is_unreachable(op)) { _PyObject_ASSERT(op, _PyObject_GC_IS_TRACKED(op)); gc_clear_unreachable(op); - return _PyObjectStack_Push(stack, op); + return _PyObjectStack_Push((_PyObjectStack *)stack, op); } return 0; } @@ -1003,7 +1015,7 @@ mark_reachable(PyObject *op) _PyObjectStack stack = { NULL }; do { traverseproc traverse = Py_TYPE(op)->tp_traverse; - if (traverse(op, (visitproc)&visit_clear_unreachable, &stack) < 0) { + if (traverse(op, visit_clear_unreachable, &stack) < 0) { _PyObjectStack_Clear(&stack); return -1; } @@ -1273,7 +1285,7 @@ gc_propagate_alive_prefetch(gc_mark_args_t *args) return -1; } } - else if (traverse(op, (visitproc)&gc_mark_enqueue_buffer, args) < 0) { + else if (traverse(op, gc_mark_enqueue_buffer_visitproc, args) < 0) { return -1; } } @@ -1294,7 +1306,7 @@ gc_propagate_alive(gc_mark_args_t *args) assert(_PyObject_GC_IS_TRACKED(op)); assert(gc_is_alive(op)); traverseproc traverse = Py_TYPE(op)->tp_traverse; - if (traverse(op, (visitproc)&gc_mark_enqueue_no_buffer, args) < 0) { + if (traverse(op, gc_mark_enqueue_no_buffer_visitproc, args) < 0) { return -1; } } @@ -1751,9 +1763,7 @@ handle_resurrected_objects(struct collection_state *state) op->ob_ref_local -= 1; traverseproc traverse = Py_TYPE(op)->tp_traverse; - (void) traverse(op, - (visitproc)visit_decref_unreachable, - NULL); + (void)traverse(op, visit_decref_unreachable, NULL); } // Find resurrected objects From 71879a779e7711f8f185b8ed9b4ad397009e21a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Thu, 10 Apr 2025 12:24:06 +0200 Subject: [PATCH 2/4] temporary patch for mis-aligned read/write --- Include/internal/mimalloc/mimalloc/types.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Include/internal/mimalloc/mimalloc/types.h b/Include/internal/mimalloc/mimalloc/types.h index 354839ba955b36..3d61c433736128 100644 --- a/Include/internal/mimalloc/mimalloc/types.h +++ b/Include/internal/mimalloc/mimalloc/types.h @@ -33,7 +33,7 @@ terms of the MIT license. A copy of the license can be found in the file #define MI_MAX_ALIGN_SIZE 16 // sizeof(max_align_t) #endif -#define MI_CACHE_LINE 64 +#define MI_CACHE_LINE 8 #if defined(_MSC_VER) #pragma warning(disable:4127) // suppress constant conditional warning (due to MI_SECURE paths) #pragma warning(disable:26812) // unscoped enum warning From fe6ba71b5618625e33a66f03b971167da92cf888 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Thu, 10 Apr 2025 12:47:07 +0200 Subject: [PATCH 3/4] fix UB in `get_code_with_unused_tlbc` --- Objects/codeobject.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Objects/codeobject.c b/Objects/codeobject.c index 33505b40a7329f..226c64f717dc82 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -2996,8 +2996,9 @@ is_bytecode_unused(_PyCodeArray *tlbc, Py_ssize_t idx, } static int -get_code_with_unused_tlbc(PyObject *obj, struct get_code_args *args) +get_code_with_unused_tlbc(PyObject *obj, void *data) { + struct get_code_args *args = (struct get_code_args *) data; if (!PyCode_Check(obj)) { return 1; } @@ -3046,7 +3047,7 @@ _Py_ClearUnusedTLBC(PyInterpreterState *interp) } // Collect code objects that have bytecode not in use by any thread _PyGC_VisitObjectsWorldStopped( - interp, (gcvisitobjects_t)get_code_with_unused_tlbc, &args); + interp, get_code_with_unused_tlbc, &args); if (args.err < 0) { goto err; } From bcb59e2c919003bfd75906f52d8aef4af756bded Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Sat, 12 Apr 2025 09:22:06 +0200 Subject: [PATCH 4/4] Revert "temporary patch for mis-aligned read/write" This reverts commit 71879a779e7711f8f185b8ed9b4ad397009e21a7. --- Include/internal/mimalloc/mimalloc/types.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Include/internal/mimalloc/mimalloc/types.h b/Include/internal/mimalloc/mimalloc/types.h index 3d61c433736128..354839ba955b36 100644 --- a/Include/internal/mimalloc/mimalloc/types.h +++ b/Include/internal/mimalloc/mimalloc/types.h @@ -33,7 +33,7 @@ terms of the MIT license. A copy of the license can be found in the file #define MI_MAX_ALIGN_SIZE 16 // sizeof(max_align_t) #endif -#define MI_CACHE_LINE 8 +#define MI_CACHE_LINE 64 #if defined(_MSC_VER) #pragma warning(disable:4127) // suppress constant conditional warning (due to MI_SECURE paths) #pragma warning(disable:26812) // unscoped enum warning