https://github.com/python/cpython/commit/fbebca289d811669fc1980e3a135325b8542a846
commit: fbebca289d811669fc1980e3a135325b8542a846
branch: main
author: Sergey Miryanov <[email protected]>
committer: kumaraditya303 <[email protected]>
date: 2025-11-12T10:29:48+05:30
summary:

GH-116946: eliminate the need for the GC in the `_thread.lock` and 
`_thread.RLock` (#141268)

files:
M Modules/_threadmodule.c

diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c
index cc8277c5783858..0e22c7bd386be1 100644
--- a/Modules/_threadmodule.c
+++ b/Modules/_threadmodule.c
@@ -41,6 +41,7 @@ typedef struct {
 typedef struct {
     PyObject_HEAD
     PyMutex lock;
+    PyObject *weakreflist; /* List of weak references */
 } lockobject;
 
 #define lockobject_CAST(op) ((lockobject *)(op))
@@ -48,6 +49,7 @@ typedef struct {
 typedef struct {
     PyObject_HEAD
     _PyRecursiveMutex lock;
+    PyObject *weakreflist; /* List of weak references */
 } rlockobject;
 
 #define rlockobject_CAST(op)    ((rlockobject *)(op))
@@ -767,7 +769,6 @@ static PyType_Spec ThreadHandle_Type_spec = {
 static void
 lock_dealloc(PyObject *self)
 {
-    PyObject_GC_UnTrack(self);
     PyObject_ClearWeakRefs(self);
     PyTypeObject *tp = Py_TYPE(self);
     tp->tp_free(self);
@@ -999,6 +1000,10 @@ lock_new_impl(PyTypeObject *type)
     return (PyObject *)self;
 }
 
+static PyMemberDef lock_members[] = {
+    {"__weaklistoffset__", Py_T_PYSSIZET, offsetof(lockobject, weakreflist), 
Py_READONLY},
+    {NULL}
+};
 
 static PyMethodDef lock_methods[] = {
     _THREAD_LOCK_ACQUIRE_LOCK_METHODDEF
@@ -1034,8 +1039,8 @@ static PyType_Slot lock_type_slots[] = {
     {Py_tp_dealloc, lock_dealloc},
     {Py_tp_repr, lock_repr},
     {Py_tp_doc, (void *)lock_doc},
+    {Py_tp_members, lock_members},
     {Py_tp_methods, lock_methods},
-    {Py_tp_traverse, _PyObject_VisitType},
     {Py_tp_new, lock_new},
     {0, 0}
 };
@@ -1043,8 +1048,7 @@ static PyType_Slot lock_type_slots[] = {
 static PyType_Spec lock_type_spec = {
     .name = "_thread.lock",
     .basicsize = sizeof(lockobject),
-    .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
-              Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_MANAGED_WEAKREF),
+    .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE),
     .slots = lock_type_slots,
 };
 
@@ -1059,7 +1063,6 @@ rlock_locked_impl(rlockobject *self)
 static void
 rlock_dealloc(PyObject *self)
 {
-    PyObject_GC_UnTrack(self);
     PyObject_ClearWeakRefs(self);
     PyTypeObject *tp = Py_TYPE(self);
     tp->tp_free(self);
@@ -1319,6 +1322,11 @@ _thread_RLock__at_fork_reinit_impl(rlockobject *self)
 #endif  /* HAVE_FORK */
 
 
+static PyMemberDef rlock_members[] = {
+    {"__weaklistoffset__", Py_T_PYSSIZET, offsetof(rlockobject, weakreflist), 
Py_READONLY},
+    {NULL}
+};
+
 static PyMethodDef rlock_methods[] = {
     _THREAD_RLOCK_ACQUIRE_METHODDEF
     _THREAD_RLOCK_RELEASE_METHODDEF
@@ -1339,10 +1347,10 @@ static PyMethodDef rlock_methods[] = {
 static PyType_Slot rlock_type_slots[] = {
     {Py_tp_dealloc, rlock_dealloc},
     {Py_tp_repr, rlock_repr},
+    {Py_tp_members, rlock_members},
     {Py_tp_methods, rlock_methods},
     {Py_tp_alloc, PyType_GenericAlloc},
     {Py_tp_new, rlock_new},
-    {Py_tp_traverse, _PyObject_VisitType},
     {0, 0},
 };
 
@@ -1350,7 +1358,7 @@ static PyType_Spec rlock_type_spec = {
     .name = "_thread.RLock",
     .basicsize = sizeof(rlockobject),
     .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
-              Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_IMMUTABLETYPE | 
Py_TPFLAGS_MANAGED_WEAKREF),
+              Py_TPFLAGS_IMMUTABLETYPE),
     .slots = rlock_type_slots,
 };
 

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]

Reply via email to