Skip to content

Commit f1b7961

Browse files
GH-116946: revert eliminate the need for the GC in the _thread.lock and _thread.RLock (#141448)
Revert "GH-116946: eliminate the need for the GC in the `_thread.lock` and `_thread.RLock` (#141268)" This reverts commit fbebca2.
1 parent ef474cf commit f1b7961

File tree

1 file changed

+7
-15
lines changed

1 file changed

+7
-15
lines changed

Modules/_threadmodule.c

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -41,15 +41,13 @@ typedef struct {
4141
typedef struct {
4242
PyObject_HEAD
4343
PyMutex lock;
44-
PyObject *weakreflist; /* List of weak references */
4544
} lockobject;
4645

4746
#define lockobject_CAST(op) ((lockobject *)(op))
4847

4948
typedef struct {
5049
PyObject_HEAD
5150
_PyRecursiveMutex lock;
52-
PyObject *weakreflist; /* List of weak references */
5351
} rlockobject;
5452

5553
#define rlockobject_CAST(op) ((rlockobject *)(op))
@@ -769,6 +767,7 @@ static PyType_Spec ThreadHandle_Type_spec = {
769767
static void
770768
lock_dealloc(PyObject *self)
771769
{
770+
PyObject_GC_UnTrack(self);
772771
PyObject_ClearWeakRefs(self);
773772
PyTypeObject *tp = Py_TYPE(self);
774773
tp->tp_free(self);
@@ -1000,10 +999,6 @@ lock_new_impl(PyTypeObject *type)
1000999
return (PyObject *)self;
10011000
}
10021001

1003-
static PyMemberDef lock_members[] = {
1004-
{"__weaklistoffset__", Py_T_PYSSIZET, offsetof(lockobject, weakreflist), Py_READONLY},
1005-
{NULL}
1006-
};
10071002

10081003
static PyMethodDef lock_methods[] = {
10091004
_THREAD_LOCK_ACQUIRE_LOCK_METHODDEF
@@ -1039,16 +1034,17 @@ static PyType_Slot lock_type_slots[] = {
10391034
{Py_tp_dealloc, lock_dealloc},
10401035
{Py_tp_repr, lock_repr},
10411036
{Py_tp_doc, (void *)lock_doc},
1042-
{Py_tp_members, lock_members},
10431037
{Py_tp_methods, lock_methods},
1038+
{Py_tp_traverse, _PyObject_VisitType},
10441039
{Py_tp_new, lock_new},
10451040
{0, 0}
10461041
};
10471042

10481043
static PyType_Spec lock_type_spec = {
10491044
.name = "_thread.lock",
10501045
.basicsize = sizeof(lockobject),
1051-
.flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE),
1046+
.flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
1047+
Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_MANAGED_WEAKREF),
10521048
.slots = lock_type_slots,
10531049
};
10541050

@@ -1063,6 +1059,7 @@ rlock_locked_impl(rlockobject *self)
10631059
static void
10641060
rlock_dealloc(PyObject *self)
10651061
{
1062+
PyObject_GC_UnTrack(self);
10661063
PyObject_ClearWeakRefs(self);
10671064
PyTypeObject *tp = Py_TYPE(self);
10681065
tp->tp_free(self);
@@ -1322,11 +1319,6 @@ _thread_RLock__at_fork_reinit_impl(rlockobject *self)
13221319
#endif /* HAVE_FORK */
13231320

13241321

1325-
static PyMemberDef rlock_members[] = {
1326-
{"__weaklistoffset__", Py_T_PYSSIZET, offsetof(rlockobject, weakreflist), Py_READONLY},
1327-
{NULL}
1328-
};
1329-
13301322
static PyMethodDef rlock_methods[] = {
13311323
_THREAD_RLOCK_ACQUIRE_METHODDEF
13321324
_THREAD_RLOCK_RELEASE_METHODDEF
@@ -1347,18 +1339,18 @@ static PyMethodDef rlock_methods[] = {
13471339
static PyType_Slot rlock_type_slots[] = {
13481340
{Py_tp_dealloc, rlock_dealloc},
13491341
{Py_tp_repr, rlock_repr},
1350-
{Py_tp_members, rlock_members},
13511342
{Py_tp_methods, rlock_methods},
13521343
{Py_tp_alloc, PyType_GenericAlloc},
13531344
{Py_tp_new, rlock_new},
1345+
{Py_tp_traverse, _PyObject_VisitType},
13541346
{0, 0},
13551347
};
13561348

13571349
static PyType_Spec rlock_type_spec = {
13581350
.name = "_thread.RLock",
13591351
.basicsize = sizeof(rlockobject),
13601352
.flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
1361-
Py_TPFLAGS_IMMUTABLETYPE),
1353+
Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_MANAGED_WEAKREF),
13621354
.slots = rlock_type_slots,
13631355
};
13641356

0 commit comments

Comments
 (0)