]> git.ipfire.org Git - pakfire.git/commitdiff
libpakfire: Implement refcounting for package lists
authorMichael Tremer <michael.tremer@ipfire.org>
Sun, 14 Jan 2018 18:35:56 +0000 (19:35 +0100)
committerMichael Tremer <michael.tremer@ipfire.org>
Sun, 14 Jan 2018 18:35:56 +0000 (19:35 +0100)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/_pakfire/relation.c
src/_pakfire/selector.c
src/libpakfire/include/pakfire/packagelist.h
src/libpakfire/libpakfire.sym
src/libpakfire/packagelist.c
src/libpakfire/transaction.c

index 7a648787327dc206722839dd5119b32a1dfd36c3..1b5b11ce0559c3e477ba6e1235ea4496f3f1d18b 100644 (file)
@@ -122,7 +122,7 @@ static PyObject* Relation_get_providers(RelationObject* self) {
                Py_DECREF(obj);
        }
 
-       pakfire_packagelist_free(packagelist);
+       pakfire_packagelist_unref(packagelist);
 
        return list;
 }
index f6634cb85a95fffeedf85404e5b798d3aeb881d7..c0a85427cb7d1ce5cee4d74b5d95edcfb30b957d 100644 (file)
@@ -96,7 +96,7 @@ static PyObject* Selector_get_providers(SelectorObject* self) {
                Py_DECREF(obj);
        }
 
-       pakfire_packagelist_free(packagelist);
+       pakfire_packagelist_unref(packagelist);
 
        return list;
 }
index 3d00fd11150cf0daf923e71461062d15500b0d66..c6582c14c7b97cfd236f03c87dec5ef868b717bb 100644 (file)
 #include <pakfire/types.h>
 
 PakfirePackageList pakfire_packagelist_create(void);
-void pakfire_packagelist_free(PakfirePackageList list);
+PakfirePackageList pakfire_packagelist_ref(PakfirePackageList list);
+PakfirePackageList pakfire_packagelist_unref(PakfirePackageList list);
 
-int pakfire_packagelist_count(PakfirePackageList list);
+size_t pakfire_packagelist_count(PakfirePackageList list);
 void pakfire_packagelist_sort(PakfirePackageList list);
 int pakfire_packagelist_has(PakfirePackageList list, PakfirePackage pkg);
-PakfirePackage pakfire_packagelist_get(PakfirePackageList list, int index);
+PakfirePackage pakfire_packagelist_get(PakfirePackageList list, unsigned int index);
 
 void pakfire_packagelist_push(PakfirePackageList list, PakfirePackage pkg);
 void pakfire_packagelist_push_if_not_exists(PakfirePackageList list, PakfirePackage pkg);
 
 #ifdef PAKFIRE_PRIVATE
 
-struct _PakfirePackageList {
-       PakfirePackage* elements;
-       int count;
-};
-
 PakfirePackageList pakfire_packagelist_from_queue(PakfirePool _pool, Queue* q);
 
 #endif
index 0a4e99ad1e1fb4572692b0eaee3dbb318a6dc0cd..1c62456dd8b2313122618f6a0956a1bd132f49b0 100644 (file)
@@ -186,12 +186,13 @@ global:
        # packagelist
        pakfire_packagelist_count;
        pakfire_packagelist_create;
-       pakfire_packagelist_free;
        pakfire_packagelist_get;
        pakfire_packagelist_has;
        pakfire_packagelist_push;
        pakfire_packagelist_push_if_not_exists;
+       pakfire_packagelist_ref;
        pakfire_packagelist_sort;
+       pakfire_packagelist_unref;
 
        # pool
        pakfire_pool_count;
index 42cc1777a52962f8d1f1420cd7b91b5b04deb563..560e8ffdddcce0f0983b8777c74f2762fd464c2b 100644 (file)
@@ -25,6 +25,7 @@
 #include <solv/solver.h>
 #include <solv/util.h>
 
+#include <pakfire/logging.h>
 #include <pakfire/package.h>
 #include <pakfire/packagelist.h>
 #include <pakfire/private.h>
 
 #define BLOCK_SIZE 31
 
+struct _PakfirePackageList {
+       PakfirePackage* elements;
+       size_t count;
+       int nrefs;
+};
+
 PAKFIRE_EXPORT PakfirePackageList pakfire_packagelist_create(void) {
        PakfirePackageList list = pakfire_calloc(1, sizeof(*list));
+       if (list) {
+               DEBUG("Allocated PackageList at %p\n", list);
+               list->nrefs = 1;
+       }
+
+       return list;
+}
+
+PAKFIRE_EXPORT PakfirePackageList pakfire_packagelist_ref(PakfirePackageList list) {
+       list->nrefs++;
 
        return list;
 }
 
-PAKFIRE_EXPORT void pakfire_packagelist_free(PakfirePackageList list) {
-       for (int i = 0; i < list->count; i++) {
-               PakfirePackage pkg = list->elements[i];
-               pakfire_package_unref(pkg);
+static void pakfire_packagelist_free(PakfirePackageList list) {
+       for (unsigned int i = 0; i < list->count; i++) {
+               pakfire_package_unref(list->elements[i]);
        }
 
        pakfire_free(list->elements);
        pakfire_free(list);
+
+       DEBUG("Released PackageList at %p\n", list);
+}
+
+PAKFIRE_EXPORT PakfirePackageList pakfire_packagelist_unref(PakfirePackageList list) {
+       if (!list)
+               return NULL;
+
+       if (--list->nrefs > 0)
+               return list;
+
+       pakfire_packagelist_free(list);
+       return NULL;
 }
 
-PAKFIRE_EXPORT int pakfire_packagelist_count(PakfirePackageList list) {
+PAKFIRE_EXPORT size_t pakfire_packagelist_count(PakfirePackageList list) {
        return list->count;
 }
 
@@ -61,7 +90,7 @@ PAKFIRE_EXPORT void pakfire_packagelist_sort(PakfirePackageList list) {
        qsort(list->elements, list->count, sizeof(*list->elements), _packagelist_cmp);
 }
 
-PAKFIRE_EXPORT PakfirePackage pakfire_packagelist_get(PakfirePackageList list, int index) {
+PAKFIRE_EXPORT PakfirePackage pakfire_packagelist_get(PakfirePackageList list, unsigned int index) {
        if (index < list->count)
                return pakfire_package_ref(list->elements[index]);
 
@@ -69,7 +98,7 @@ PAKFIRE_EXPORT PakfirePackage pakfire_packagelist_get(PakfirePackageList list, i
 }
 
 PAKFIRE_EXPORT int pakfire_packagelist_has(PakfirePackageList list, PakfirePackage pkg) {
-       for (int i = 0; i < list->count; i++) {
+       for (unsigned int i = 0; i < list->count; i++) {
                PakfirePackage _pkg = list->elements[i];
 
                if (pakfire_package_identical(pkg, _pkg))
index bfbb8c53e0032f6c9fd58d6cfbfddae1179ee71f..bdf3079227dd49448271b5cde00f14bc6a3d5e7c 100644 (file)
@@ -231,7 +231,7 @@ static size_t pakfire_transaction_add_section(char** str, size_t width, PakfireT
        pakfire_transaction_add_newline(str, width);
 
 END:
-       pakfire_packagelist_free(list);
+       pakfire_packagelist_unref(list);
 
        return c;
 }