summaryrefslogtreecommitdiff
path: root/python
diff options
context:
space:
mode:
authorPanu Matilainen <pmatilai@redhat.com>2007-06-07 21:51:59 +0300
committerPanu Matilainen <pmatilai@redhat.com>2007-06-07 21:51:59 +0300
commit48048a39309e180fa439b1b158a87c2081bafbaa (patch)
treed36f229882a2f01151dee05a0eacfcf996815250 /python
parent578e90f2f83ba1872890182902f0fd0de28db402 (diff)
downloadrpm-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.c2
-rw-r--r--python/rpmmi-py.c5
-rw-r--r--python/rpmmi-py.h3
-rw-r--r--python/rpmts-py.c2
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