]> git.ipfire.org Git - pakfire.git/commitdiff
libpakfire: Implement reference counting to packages
authorMichael Tremer <michael.tremer@ipfire.org>
Sun, 14 Jan 2018 16:59:25 +0000 (17:59 +0100)
committerMichael Tremer <michael.tremer@ipfire.org>
Sun, 14 Jan 2018 16:59:25 +0000 (17:59 +0100)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/_pakfire/package.c
src/_pakfire/step.c
src/libpakfire/include/pakfire/package.h
src/libpakfire/libpakfire.sym
src/libpakfire/package.c
src/libpakfire/packagelist.c
src/libpakfire/step.c
src/libpakfire/transaction.c

index 7e41df5c4705bd4a69c2e1da26bd8f6c43147a94..f6e68a37115dafbecc4fa0c3c854ff74a84c4b5e 100644 (file)
@@ -50,7 +50,7 @@ static PyObject* Package_new(PyTypeObject* type, PyObject* args, PyObject* kwds)
 
 static void Package_dealloc(PackageObject* self) {
        if (self->package)
-               pakfire_package_free(self->package);
+               pakfire_package_unref(self->package);
 
        Py_TYPE(self)->tp_free((PyObject *)self);
 }
index 3c79cf3a6eeba6aabac5292246f1554d45622ace..4406e0690d14fe8b387a70412e0e33eb6645fe68 100644 (file)
@@ -91,7 +91,7 @@ static PyObject* Step_repr(StepObject* self) {
        PyObject* repr = PyUnicode_FromFormat("<_pakfire.Step object type %s, %s>",
                pakfire_step_get_type_string(self->step), nevra);
 
-       pakfire_package_free(package);
+       pakfire_package_unref(package);
        pakfire_free(nevra);
 
        return repr;
@@ -101,7 +101,7 @@ static PyObject* Step_get_package(StepObject* self) {
        PakfirePackage package = pakfire_step_get_package(self->step);
 
        PyObject* obj = new_package(self->transaction->request->pool, pakfire_package_id(package));
-       pakfire_package_free(package);
+       pakfire_package_unref(package);
 
        return obj;
 }
index 31e260edc09849183056efb08e0ed320853b4006..fd722f16fad32a4ac5ff6a2a337e2121b86aed23 100644 (file)
@@ -30,7 +30,9 @@
 
 PakfirePackage pakfire_package_create(PakfirePool pool, Id id);
 PakfirePackage pakfire_package_create2(PakfirePool pool, PakfireRepo repo, const char* name, const char* evr, const char* arch);
-void pakfire_package_free(PakfirePackage pkg);
+
+PakfirePackage pakfire_package_ref(PakfirePackage pkg);
+PakfirePackage pakfire_package_unref(PakfirePackage pkg);
 
 int pakfire_package_identical(PakfirePackage pkg1, PakfirePackage pkg2);
 int pakfire_package_cmp(PakfirePackage pkg1, PakfirePackage pkg2);
index 7be27e1e388f7c359a923bb2aafed4ffdb6273ba..22a8bfa5ed7f9fe2f0d6a956bbff0d01532be982 100644 (file)
@@ -120,7 +120,6 @@ global:
        pakfire_package_dump;
        pakfire_package_filelist_append;
        pakfire_package_filelist_remove;
-       pakfire_package_free;
        pakfire_package_get_arch;
        pakfire_package_get_buildhost;
        pakfire_package_get_buildtime;
@@ -157,6 +156,7 @@ global:
        pakfire_package_get_version;
        pakfire_package_id;
        pakfire_package_is_installed;
+       pakfire_package_ref;
        pakfire_package_set_arch;
        pakfire_package_set_buildhost;
        pakfire_package_set_buildtime;
@@ -181,6 +181,7 @@ global:
        pakfire_package_set_url;
        pakfire_package_set_uuid;
        pakfire_package_set_vendor;
+       pakfire_package_unref;
 
        # packagelist
        pakfire_packagelist_count;
index 0bbbbac97e6740cc8bb7692e1bcd6ec7296ef507..9681b860f2dc43f07c5d7f59a373d722fd16ff58 100644 (file)
@@ -79,15 +79,29 @@ PAKFIRE_EXPORT PakfirePackage pakfire_package_create2(PakfirePool pool, PakfireR
        return pkg;
 }
 
-PAKFIRE_EXPORT void pakfire_package_free(PakfirePackage pkg) {
-       if (--pkg->nrefs > 0)
-               return;
-
+static void pakfire_package_free(PakfirePackage pkg) {
        pakfire_pool_unref(pkg->pool);
        pakfire_package_filelist_remove(pkg);
        pakfire_free(pkg);
 }
 
+PAKFIRE_EXPORT PakfirePackage pakfire_package_ref(PakfirePackage pkg) {
+       pkg->nrefs++;
+
+       return pkg;
+}
+
+PAKFIRE_EXPORT PakfirePackage pakfire_package_unref(PakfirePackage pkg) {
+       if (!pkg)
+               return NULL;
+
+       if (--pkg->nrefs > 0)
+               return pkg;
+
+       pakfire_package_free(pkg);
+       return NULL;
+}
+
 static Solvable* get_solvable(PakfirePackage pkg) {
        Pool* pool = pakfire_package_get_solv_pool(pkg);
 
index 0644bb9db25e0797373bfd8524e5533111497d2e..bdee00e3416fc222a75f016006ee35f19f66929a 100644 (file)
@@ -42,7 +42,7 @@ PAKFIRE_EXPORT PakfirePackageList pakfire_packagelist_create(void) {
 PAKFIRE_EXPORT void pakfire_packagelist_free(PakfirePackageList list) {
        for (int i = 0; i < list->count; i++) {
                PakfirePackage pkg = list->elements[i];
-               pakfire_package_free(pkg);
+               pakfire_package_unref(pkg);
        }
 
        pakfire_free(list->elements);
@@ -88,7 +88,7 @@ PAKFIRE_EXPORT void pakfire_packagelist_push_if_not_exists(PakfirePackageList li
        if (pakfire_packagelist_has(list, pkg))
                return;
 
-       pakfire_packagelist_push(list, pkg);
+       pakfire_packagelist_push(list, pakfire_package_ref(pkg));
 }
 
 PAKFIRE_EXPORT PakfirePackageList pakfire_packagelist_from_queue(PakfirePool _pool, Queue* q) {
index ed90cc5fd23aca79fa3d3eb15deee2a7d4acb2e9..c06b3f0a31f29c3d61341ba7f0dfd65ec14551ca 100644 (file)
@@ -145,8 +145,7 @@ PAKFIRE_EXPORT unsigned long long pakfire_step_get_downloadsize(PakfireStep step
                downloadsize = pakfire_package_get_downloadsize(pkg);
        }
 
-       if (pkg)
-               pakfire_package_free(pkg);
+       pakfire_package_unref(pkg);
 
        return downloadsize;
 }
@@ -167,7 +166,7 @@ PAKFIRE_EXPORT long pakfire_step_get_installsizechange(PakfireStep step) {
                        break;
        }
 
-       pakfire_package_free(pkg);
+       pakfire_package_unref(pkg);
 
        return installsize;
 }
@@ -196,8 +195,7 @@ PAKFIRE_EXPORT int pakfire_step_needs_download(PakfireStep step) {
        ret = !pakfire_cache_has_package(cache, pkg);
 
 finish:
-       if (pkg)
-               pakfire_package_free(pkg);
+       pakfire_package_unref(pkg);
 
        return ret;
 }
@@ -336,7 +334,7 @@ PAKFIRE_EXPORT int pakfire_step_run(PakfireStep step, const pakfire_action_type
        }
 
 END:
-       pakfire_package_free(pkg);
+       pakfire_package_unref(pkg);
 
        return r;
 }
index 640cd20b33295693cce6d19c5ca80bd121c8374d..badbf31129ddd7f88b7e9526976dc58b5ea7edae 100644 (file)
@@ -138,7 +138,7 @@ PAKFIRE_EXPORT PakfirePackageList pakfire_transaction_get_packages(PakfireTransa
                        PakfirePackage package = pakfire_step_get_package(step);
                        pakfire_packagelist_push(packagelist, package);
 
-                       pakfire_package_free(package);
+                       pakfire_package_unref(package);
                }
 
                pakfire_step_free(step);