supermin/0008-rpm-reuse-the-rpmtd-when-possible.patch
2014-10-07 15:27:35 +02:00

92 lines
2.3 KiB
Diff

From 3a967a746008001fb9b7ade5451d19a1f1956601 Mon Sep 17 00:00:00 2001
From: Pino Toscano <ptoscano@redhat.com>
Date: Thu, 18 Sep 2014 16:37:48 +0200
Subject: [PATCH] rpm: reuse the rpmtd when possible
Use a single rpmtd object per operation, making sure it is properly
cleaned when needed. This slightly reduces the number of malloc/free's.
---
src/librpm-c.c | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/src/librpm-c.c b/src/librpm-c.c
index e5079b1..1ae3bad 100644
--- a/src/librpm-c.c
+++ b/src/librpm-c.c
@@ -185,6 +185,7 @@ supermin_rpm_installed (value rpmv, value pkgv)
rpmdbMatchIterator iter;
int count, i;
Header h;
+ rpmtd td;
data = Librpm_val (rpmv);
if (data.ts == NULL)
@@ -200,16 +201,15 @@ supermin_rpm_installed (value rpmv, value pkgv)
rv = caml_alloc (count, 0);
i = 0;
+ td = rpmtdNew ();
while ((h = rpmdbNextIterator (iter)) != NULL) {
HeaderIterator hi;
- rpmtd td;
uint32_t *val;
bool stored_vals[5] = { false };
v = caml_alloc (5, 0);
hi = headerInitIterator (h);
- td = rpmtdNew ();
while (headerNext (hi, td) == 1) {
switch (rpmtdTag (td)) {
case RPMTAG_NAME:
@@ -251,11 +251,11 @@ supermin_rpm_installed (value rpmv, value pkgv)
Store_field (v, 4, caml_copy_string ("unknown"));
Store_field (rv, i, v);
- rpmtdFree (td);
headerFreeIterator (hi);
++i;
}
+ rpmtdFree (td);
rpmdbFreeIterator (iter);
CAMLreturn (rv);
@@ -334,6 +334,7 @@ supermin_rpm_pkg_whatprovides (value rpmv, value pkgv)
rpmdbMatchIterator iter;
int count, i;
Header h;
+ rpmtd td;
data = Librpm_val (rpmv);
if (data.ts == NULL)
@@ -349,12 +350,11 @@ supermin_rpm_pkg_whatprovides (value rpmv, value pkgv)
rv = caml_alloc (count, 0);
i = 0;
+ td = rpmtdNew ();
while ((h = rpmdbNextIterator (iter)) != NULL) {
- rpmtd td;
int ret;
- td = rpmtdNew ();
ret = headerGet (h, RPMTAG_NAME, td, HEADERGET_MINMEM);
if (ret != 1)
caml_failwith ("rpm_pkg_whatprovides: headerGet failed");
@@ -362,10 +362,10 @@ supermin_rpm_pkg_whatprovides (value rpmv, value pkgv)
Store_field (rv, i, caml_copy_string (rpmtdGetString (td)));
rpmtdFreeData (td);
- rpmtdFree (td);
++i;
}
+ rpmtdFree (td);
rpmdbFreeIterator (iter);
CAMLreturn (rv);
--
1.9.3