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

This commit is contained in:
Sergey Miryanov 2025-11-12 09:59:48 +05:00 committed by GitHub
parent 9ce99c6c19
commit fbebca289d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

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