diff options
author | Panu Matilainen <pmatilai@redhat.com> | 2007-06-07 21:51:59 +0300 |
---|---|---|
committer | Panu Matilainen <pmatilai@redhat.com> | 2007-06-07 21:51:59 +0300 |
commit | 48048a39309e180fa439b1b158a87c2081bafbaa (patch) | |
tree | d36f229882a2f01151dee05a0eacfcf996815250 /python | |
parent | 578e90f2f83ba1872890182902f0fd0de28db402 (diff) | |
download | rpm-48048a39309e180fa439b1b158a87c2081bafbaa.tar.gz rpm-48048a39309e180fa439b1b158a87c2081bafbaa.tar.bz2 rpm-48048a39309e180fa439b1b158a87c2081bafbaa.zip |
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.
Diffstat (limited to 'python')
-rw-r--r-- | python/rpmdb-py.c | 2 | ||||
-rw-r--r-- | python/rpmmi-py.c | 5 | ||||
-rw-r--r-- | python/rpmmi-py.h | 3 | ||||
-rw-r--r-- | 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 25fdd008e..60637d85a 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 d6ca7cedc..537804421 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 c45b2fd03..4c4f7173a 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 8f08868ba..7b395e755 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 |