@@ -66,6 +66,7 @@ void qd_python_finalize(void)
6666{
6767 (void ) qd_python_lock ();
6868
69+ Py_DECREF (message_type );
6970 Py_DECREF (dispatch_module );
7071 dispatch_module = 0 ;
7172 PyGC_Collect ();
@@ -565,7 +566,8 @@ static PyTypeObject LogAdapterType = {
565566 .tp_dealloc = (destructor )LogAdapter_dealloc ,
566567 .tp_flags = Py_TPFLAGS_DEFAULT ,
567568 .tp_methods = LogAdapter_methods ,
568- .tp_init = (initproc )LogAdapter_init
569+ .tp_init = (initproc )LogAdapter_init ,
570+ .tp_new = PyType_GenericNew ,
569571};
570572
571573
@@ -710,10 +712,24 @@ static int IoAdapter_init(IoAdapter *self, PyObject *args, PyObject *kwds)
710712 return 0 ;
711713}
712714
715+ // visit all members which may conceivably participate in reference cycles
716+ static int IoAdapter_traverse (IoAdapter * self , visitproc visit , void * arg )
717+ {
718+ Py_VISIT (self -> handler );
719+ return 0 ;
720+ }
721+
722+ static int IoAdapter_clear (IoAdapter * self )
723+ {
724+ Py_CLEAR (self -> handler );
725+ return 0 ;
726+ }
727+
713728static void IoAdapter_dealloc (IoAdapter * self )
714729{
715730 qdr_core_unsubscribe (self -> sub );
716- Py_DECREF (self -> handler );
731+ PyObject_GC_UnTrack (self );
732+ IoAdapter_clear (self );
717733 Py_TYPE (self )-> tp_free ((PyObject * )self );
718734}
719735
@@ -795,10 +811,13 @@ static PyTypeObject IoAdapterType = {
795811 .tp_name = DISPATCH_MODULE ".IoAdapter" ,
796812 .tp_doc = "Dispatch IO Adapter" ,
797813 .tp_basicsize = sizeof (IoAdapter ),
814+ .tp_traverse = (traverseproc )IoAdapter_traverse ,
815+ .tp_clear = (inquiry )IoAdapter_clear ,
798816 .tp_dealloc = (destructor )IoAdapter_dealloc ,
799- .tp_flags = Py_TPFLAGS_DEFAULT ,
817+ .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC ,
800818 .tp_methods = IoAdapter_methods ,
801819 .tp_init = (initproc )IoAdapter_init ,
820+ .tp_new = PyType_GenericNew ,
802821};
803822
804823
@@ -814,8 +833,6 @@ static void qd_register_constant(PyObject *module, const char *name, uint32_t va
814833
815834static void qd_python_setup (void )
816835{
817- LogAdapterType .tp_new = PyType_GenericNew ;
818- IoAdapterType .tp_new = PyType_GenericNew ;
819836 if ((PyType_Ready (& LogAdapterType ) < 0 ) || (PyType_Ready (& IoAdapterType ) < 0 )) {
820837 qd_error_py ();
821838 qd_log (log_source , QD_LOG_CRITICAL , "Unable to initialize Adapters" );
0 commit comments