From a4e3894fbbbe31ce6caccb44be794eba1750a974 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Sun, 14 Jan 2018 17:59:25 +0100 Subject: [PATCH] libpakfire: Implement reference counting to packages Signed-off-by: Michael Tremer --- src/_pakfire/package.c | 2 +- src/_pakfire/step.c | 4 ++-- src/libpakfire/include/pakfire/package.h | 4 +++- src/libpakfire/libpakfire.sym | 3 ++- src/libpakfire/package.c | 22 ++++++++++++++++++---- src/libpakfire/packagelist.c | 4 ++-- src/libpakfire/step.c | 10 ++++------ src/libpakfire/transaction.c | 2 +- 8 files changed, 33 insertions(+), 18 deletions(-) diff --git a/src/_pakfire/package.c b/src/_pakfire/package.c index 7e41df5c4..f6e68a371 100644 --- a/src/_pakfire/package.c +++ b/src/_pakfire/package.c @@ -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); } diff --git a/src/_pakfire/step.c b/src/_pakfire/step.c index 3c79cf3a6..4406e0690 100644 --- a/src/_pakfire/step.c +++ b/src/_pakfire/step.c @@ -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; } diff --git a/src/libpakfire/include/pakfire/package.h b/src/libpakfire/include/pakfire/package.h index 31e260edc..fd722f16f 100644 --- a/src/libpakfire/include/pakfire/package.h +++ b/src/libpakfire/include/pakfire/package.h @@ -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); diff --git a/src/libpakfire/libpakfire.sym b/src/libpakfire/libpakfire.sym index 7be27e1e3..22a8bfa5e 100644 --- a/src/libpakfire/libpakfire.sym +++ b/src/libpakfire/libpakfire.sym @@ -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; diff --git a/src/libpakfire/package.c b/src/libpakfire/package.c index 0bbbbac97..9681b860f 100644 --- a/src/libpakfire/package.c +++ b/src/libpakfire/package.c @@ -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); diff --git a/src/libpakfire/packagelist.c b/src/libpakfire/packagelist.c index 0644bb9db..bdee00e34 100644 --- a/src/libpakfire/packagelist.c +++ b/src/libpakfire/packagelist.c @@ -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) { diff --git a/src/libpakfire/step.c b/src/libpakfire/step.c index ed90cc5fd..c06b3f0a3 100644 --- a/src/libpakfire/step.c +++ b/src/libpakfire/step.c @@ -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; } diff --git a/src/libpakfire/transaction.c b/src/libpakfire/transaction.c index 640cd20b3..badbf3112 100644 --- a/src/libpakfire/transaction.c +++ b/src/libpakfire/transaction.c @@ -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); -- 2.39.5