@@ -41,15 +41,13 @@ typedef struct {
4141typedef 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
4948typedef 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 = {
769767static void
770768lock_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
10081003static 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
10481043static 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)
10631059static void
10641060rlock_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-
13301322static PyMethodDef rlock_methods [] = {
13311323 _THREAD_RLOCK_ACQUIRE_METHODDEF
13321324 _THREAD_RLOCK_RELEASE_METHODDEF
@@ -1347,18 +1339,18 @@ static PyMethodDef rlock_methods[] = {
13471339static 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
13571349static 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