From 454d7963e31cded1de3a90642da7259848efd232 Mon Sep 17 00:00:00 2001 From: Dino Viehland Date: Thu, 15 Feb 2024 16:28:31 -0800 Subject: [PATCH] gh-113743: Use per-interpreter locks for types (#115541) Move type-lock to per-interpreter lock to avoid heavy contention in interpreters test --- Include/internal/pycore_typeobject.h | 2 +- Objects/typeobject.c | 5 +++-- Python/pystate.c | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Include/internal/pycore_typeobject.h b/Include/internal/pycore_typeobject.h index 664f6fb212a..9134ab45cd0 100644 --- a/Include/internal/pycore_typeobject.h +++ b/Include/internal/pycore_typeobject.h @@ -22,7 +22,6 @@ struct _types_runtime_state { // bpo-42745: next_version_tag remains shared by all interpreters // because of static types. unsigned int next_version_tag; - PyMutex type_mutex; }; @@ -71,6 +70,7 @@ struct types_state { struct type_cache type_cache; size_t num_builtins_initialized; static_builtin_state builtins[_Py_MAX_STATIC_BUILTIN_TYPES]; + PyMutex mutex; }; diff --git a/Objects/typeobject.c b/Objects/typeobject.c index e0711dfe854..0118ee255ef 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -60,17 +60,18 @@ class object "PyObject *" "&PyBaseObject_Type" // in odd behaviors w.r.t. running with the GIL as the outer type lock could // be released and reacquired during a subclass update if there's contention // on the subclass lock. +#define TYPE_LOCK &PyInterpreterState_Get()->types.mutex #define BEGIN_TYPE_LOCK() \ { \ _PyCriticalSection _cs; \ - _PyCriticalSection_Begin(&_cs, &_PyRuntime.types.type_mutex); \ + _PyCriticalSection_Begin(&_cs, TYPE_LOCK); \ #define END_TYPE_LOCK() \ _PyCriticalSection_End(&_cs); \ } #define ASSERT_TYPE_LOCK_HELD() \ - _Py_CRITICAL_SECTION_ASSERT_MUTEX_LOCKED(&_PyRuntime.types.type_mutex) + _Py_CRITICAL_SECTION_ASSERT_MUTEX_LOCKED(TYPE_LOCK) #else diff --git a/Python/pystate.c b/Python/pystate.c index b1d1a085d62..24f9b779091 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -395,7 +395,7 @@ _Py_COMP_DIAG_POP &(runtime)->atexit.mutex, \ &(runtime)->audit_hooks.mutex, \ &(runtime)->allocators.mutex, \ - &(runtime)->types.type_mutex, \ + &(runtime)->_main_interpreter.types.mutex, \ } static void