]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-127945: add locking to malloc closure in free-threading (#131662)
authorKumar Aditya <kumaraditya@python.org>
Tue, 25 Mar 2025 11:18:46 +0000 (16:48 +0530)
committerGitHub <noreply@github.com>
Tue, 25 Mar 2025 11:18:46 +0000 (16:48 +0530)
The freelist is not thread safe in free-threading so this adds lock around it make it thread safe in free-threading.

Modules/_ctypes/malloc_closure.c

index bb4f8f21bd3f7787d55e79b0e7dbcae5549ab23d..80ba96614bff79955ad593455e210d566ff9426f 100644 (file)
 
 /******************************************************************/
 
+
+#ifdef Py_GIL_DISABLED
+static PyMutex malloc_closure_lock;
+# define MALLOC_CLOSURE_LOCK()   PyMutex_Lock(&malloc_closure_lock)
+# define MALLOC_CLOSURE_UNLOCK() PyMutex_Unlock(&malloc_closure_lock)
+#else
+# define MALLOC_CLOSURE_LOCK()   ((void)0)
+# define MALLOC_CLOSURE_UNLOCK() ((void)0)
+#endif
+
 typedef union _tagITEM {
     ffi_closure closure;
     union _tagITEM *next;
@@ -110,9 +120,11 @@ void Py_ffi_closure_free(void *p)
     }
 #endif
 #endif
+    MALLOC_CLOSURE_LOCK();
     ITEM *item = (ITEM *)p;
     item->next = free_list;
     free_list = item;
+    MALLOC_CLOSURE_UNLOCK();
 }
 
 /* return one item from the free list, allocating more if needed */
@@ -131,11 +143,15 @@ void *Py_ffi_closure_alloc(size_t size, void** codeloc)
     }
 #endif
 #endif
+    MALLOC_CLOSURE_LOCK();
     ITEM *item;
-    if (!free_list)
+    if (!free_list) {
         more_core();
-    if (!free_list)
+    }
+    if (!free_list) {
+        MALLOC_CLOSURE_UNLOCK();
         return NULL;
+    }
     item = free_list;
     free_list = item->next;
 #ifdef _M_ARM
@@ -144,5 +160,6 @@ void *Py_ffi_closure_alloc(size_t size, void** codeloc)
 #else
     *codeloc = (void *)item;
 #endif
+    MALLOC_CLOSURE_UNLOCK();
     return (void *)item;
 }