From 48048a39309e180fa439b1b158a87c2081bafbaa Mon Sep 17 00:00:00 2001 From: Panu Matilainen Date: Thu, 7 Jun 2007 21:51:59 +0300 Subject: [PATCH] Ts/db reference counting for match-iterators in python (rhbz#241751) Adds additional refcounting to the python level ts/db object to avoid anonymous ts/db from getting deleted while still iterating over it. --- python/rpmdb-py.c | 2 +- python/rpmmi-py.c | 5 ++++- python/rpmmi-py.h | 3 ++- python/rpmts-py.c | 2 +- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/python/rpmdb-py.c b/python/rpmdb-py.c index 25fdd00..60637d8 100644 --- a/python/rpmdb-py.c +++ b/python/rpmdb-py.c @@ -126,7 +126,7 @@ rpmdb_Match (rpmdbObject * s, PyObject * args, PyObject * kwds) return NULL; } - return rpmmi_Wrap( rpmdbInitIterator(s->db, tag, key, len) ); + return rpmmi_Wrap( rpmdbInitIterator(s->db, tag, key, len), (PyObject *)s); } /** diff --git a/python/rpmmi-py.c b/python/rpmmi-py.c index d6ca7ce..5378044 100644 --- a/python/rpmmi-py.c +++ b/python/rpmmi-py.c @@ -199,6 +199,7 @@ static void rpmmi_dealloc(/*@only@*/ /*@null@*/ rpmmiObject * s) { if (s) { s->mi = rpmdbFreeIterator(s->mi); + Py_DECREF(s->ref); PyObject_Del(s); } } @@ -271,7 +272,7 @@ PyTypeObject rpmmi_Type = { }; /*@=fullinitblock@*/ -rpmmiObject * rpmmi_Wrap(rpmdbMatchIterator mi) +rpmmiObject * rpmmi_Wrap(rpmdbMatchIterator mi, PyObject *s) { rpmmiObject * mio = (rpmmiObject *) PyObject_New(rpmmiObject, &rpmmi_Type); @@ -280,6 +281,8 @@ rpmmiObject * rpmmi_Wrap(rpmdbMatchIterator mi) return NULL; } mio->mi = mi; + mio->ref = s; + Py_INCREF(mio->ref); return mio; } diff --git a/python/rpmmi-py.h b/python/rpmmi-py.h index c45b2fd..4c4f717 100644 --- a/python/rpmmi-py.h +++ b/python/rpmmi-py.h @@ -14,6 +14,7 @@ typedef struct rpmmiObject_s rpmmiObject; struct rpmmiObject_s { PyObject_HEAD PyObject *md_dict; /*!< to look like PyModuleObject */ + PyObject *ref; /* for db/ts refcounting */ rpmdbMatchIterator mi; } ; @@ -21,7 +22,7 @@ struct rpmmiObject_s { extern PyTypeObject rpmmi_Type; /*@null@*/ -rpmmiObject * rpmmi_Wrap(rpmdbMatchIterator mi) +rpmmiObject * rpmmi_Wrap(rpmdbMatchIterator mi, PyObject *s) /*@*/; #endif diff --git a/python/rpmts-py.c b/python/rpmts-py.c index 8f08868..7b395e7 100644 --- a/python/rpmts-py.c +++ b/python/rpmts-py.c @@ -1397,7 +1397,7 @@ fprintf(stderr, "*** rpmts_Match(%p) ts %p\n", s, s->ts); } } - return rpmmi_Wrap( rpmtsInitIterator(s->ts, tag, key, len) ); + return rpmmi_Wrap( rpmtsInitIterator(s->ts, tag, key, len), (PyObject*)s); } /** \ingroup py_c -- 2.7.4