]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-129185: Use PyMutex in tracemalloc (#129246)
authorVictor Stinner <vstinner@python.org>
Fri, 24 Jan 2025 10:25:24 +0000 (11:25 +0100)
committerGitHub <noreply@github.com>
Fri, 24 Jan 2025 10:25:24 +0000 (11:25 +0100)
Include/internal/pycore_tracemalloc.h
Python/tracemalloc.c

index 3fb0aa133fc41db4dcaf42df30e367a699729ce6..572e80258763197a805681e9f9a7425afe30f697 100644 (file)
@@ -70,7 +70,7 @@ struct _tracemalloc_runtime_state {
         PyMemAllocatorEx obj;
     } allocators;
 
-    PyThread_type_lock tables_lock;
+    PyMutex tables_lock;
     /* Size in bytes of currently traced memory.
        Protected by TABLES_LOCK(). */
     size_t traced_memory;
index 20651016a80ec205d1840865fc9105ad0ac79a3c..d27c2f9319ae58b80a7f1003aef3e4704b6a9571 100644 (file)
@@ -3,6 +3,7 @@
 #include "pycore_gc.h"            // PyGC_Head
 #include "pycore_hashtable.h"     // _Py_hashtable_t
 #include "pycore_initconfig.h"    // _PyStatus_NO_MEMORY()
+#include "pycore_lock.h"          // PyMutex_LockFlags()
 #include "pycore_object.h"        // _PyType_PreHeaderSize()
 #include "pycore_pymem.h"         // _Py_tracemalloc_config
 #include "pycore_runtime.h"       // _Py_ID()
@@ -37,8 +38,8 @@ static int _PyTraceMalloc_TraceRef(PyObject *op, PyRefTracerEvent event,
    the GIL held from PyMem_RawFree(). It cannot acquire the lock because it
    would introduce a deadlock in _PyThreadState_DeleteCurrent(). */
 #define tables_lock _PyRuntime.tracemalloc.tables_lock
-#define TABLES_LOCK() PyThread_acquire_lock(tables_lock, 1)
-#define TABLES_UNLOCK() PyThread_release_lock(tables_lock)
+#define TABLES_LOCK() PyMutex_LockFlags(&tables_lock, _Py_LOCK_DONT_DETACH)
+#define TABLES_UNLOCK() PyMutex_Unlock(&tables_lock)
 
 
 #define DEFAULT_DOMAIN 0
@@ -741,13 +742,6 @@ _PyTraceMalloc_Init(void)
         return _PyStatus_NO_MEMORY();
     }
 
-    if (tables_lock == NULL) {
-        tables_lock = PyThread_allocate_lock();
-        if (tables_lock == NULL) {
-            return _PyStatus_NO_MEMORY();
-        }
-    }
-
     tracemalloc_filenames = hashtable_new(hashtable_hash_pyobject,
                                           hashtable_compare_unicode,
                                           tracemalloc_clear_filename, NULL);
@@ -792,11 +786,6 @@ tracemalloc_deinit(void)
     _Py_hashtable_destroy(tracemalloc_tracebacks);
     _Py_hashtable_destroy(tracemalloc_filenames);
 
-    if (tables_lock != NULL) {
-        PyThread_free_lock(tables_lock);
-        tables_lock = NULL;
-    }
-
     PyThread_tss_delete(&tracemalloc_reentrant_key);
 }