Implement traversal for Diagnostics object

Triyng to fix a reported memory leak with diags, but implementing
traversing doesn't help. Quite the opposite in the example provided in
bug #557, the leak is present even with the `del diag`.

The leak appears with Python 3.5, not with Python 2.7.
This commit is contained in:
Daniele Varrazzo 2017-05-18 12:24:48 +01:00
parent 165449c724
commit 9f6bab692d

View File

@ -132,10 +132,23 @@ diagnostics_init(diagnosticsObject *self, PyObject *args, PyObject *kwds)
return 0; return 0;
} }
static int
diagnostics_traverse(diagnosticsObject *self, visitproc visit, void *arg)
{
Py_VISIT(self->err);
return 0;
}
static int
diagnostics_clear(diagnosticsObject *self)
{
Py_CLEAR(self->err);
return 0;
}
static void static void
diagnostics_dealloc(diagnosticsObject* self) diagnostics_dealloc(diagnosticsObject* self)
{ {
Py_CLEAR(self->err);
Py_TYPE(self)->tp_free((PyObject *)self); Py_TYPE(self)->tp_free((PyObject *)self);
} }
@ -175,10 +188,10 @@ PyTypeObject diagnosticsType = {
0, /*tp_getattro*/ 0, /*tp_getattro*/
0, /*tp_setattro*/ 0, /*tp_setattro*/
0, /*tp_as_buffer*/ 0, /*tp_as_buffer*/
Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
diagnosticsType_doc, /*tp_doc*/ diagnosticsType_doc, /*tp_doc*/
0, /*tp_traverse*/ (traverseproc)diagnostics_traverse, /*tp_traverse*/
0, /*tp_clear*/ (inquiry)diagnostics_clear, /*tp_clear*/
0, /*tp_richcompare*/ 0, /*tp_richcompare*/
0, /*tp_weaklistoffset*/ 0, /*tp_weaklistoffset*/
0, /*tp_iter*/ 0, /*tp_iter*/