Blob Blame History Raw
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