From 9f6bab692d6d84cfbe5797e963225fc002bfa3d5 Mon Sep 17 00:00:00 2001 From: Daniele Varrazzo Date: Thu, 18 May 2017 12:24:48 +0100 Subject: [PATCH] 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. --- psycopg/diagnostics_type.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/psycopg/diagnostics_type.c b/psycopg/diagnostics_type.c index 0af65265d..cdaf62f32 100644 --- a/psycopg/diagnostics_type.c +++ b/psycopg/diagnostics_type.c @@ -132,10 +132,23 @@ diagnostics_init(diagnosticsObject *self, PyObject *args, PyObject *kwds) 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 diagnostics_dealloc(diagnosticsObject* self) { - Py_CLEAR(self->err); Py_TYPE(self)->tp_free((PyObject *)self); } @@ -175,10 +188,10 @@ PyTypeObject diagnosticsType = { 0, /*tp_getattro*/ 0, /*tp_setattro*/ 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*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ + (traverseproc)diagnostics_traverse, /*tp_traverse*/ + (inquiry)diagnostics_clear, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/