From adc6f9301a08cb34e5132265a52350081e60f80a Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Sun, 14 Jan 2018 18:13:53 +0100 Subject: [PATCH] libpakfire: Implement refcounting in Step Signed-off-by: Michael Tremer --- src/_pakfire/step.c | 3 +-- src/libpakfire/include/pakfire/step.h | 4 +++- src/libpakfire/libpakfire.sym | 3 ++- src/libpakfire/step.c | 32 +++++++++++++++++++++++---- src/libpakfire/transaction.c | 6 ++--- 5 files changed, 37 insertions(+), 11 deletions(-) diff --git a/src/_pakfire/step.c b/src/_pakfire/step.c index 4406e0690..612febb41 100644 --- a/src/_pakfire/step.c +++ b/src/_pakfire/step.c @@ -58,8 +58,7 @@ static PyObject* Step_new(PyTypeObject* type, PyObject* args, PyObject* kwds) { } static void Step_dealloc(StepObject* self) { - if (self->step) - pakfire_step_free(self->step); + pakfire_step_unref(self->step); Py_XDECREF(self->transaction); Py_TYPE(self)->tp_free((PyObject *)self); diff --git a/src/libpakfire/include/pakfire/step.h b/src/libpakfire/include/pakfire/step.h index 70f43a7ff..76b433af6 100644 --- a/src/libpakfire/include/pakfire/step.h +++ b/src/libpakfire/include/pakfire/step.h @@ -26,7 +26,8 @@ #include PakfireStep pakfire_step_create(PakfireTransaction transaction, Id id); -void pakfire_step_free(PakfireStep step); +PakfireStep pakfire_step_ref(PakfireStep step); +PakfireStep pakfire_step_unref(PakfireStep step); PakfirePackage pakfire_step_get_package(PakfireStep step); pakfire_step_type_t pakfire_step_get_type(PakfireStep step); @@ -58,6 +59,7 @@ struct _PakfireStep { PakfirePool pool; PakfireTransaction transaction; Id id; + int nrefs; }; static inline PakfirePool pakfire_step_pool(PakfireStep step) { diff --git a/src/libpakfire/libpakfire.sym b/src/libpakfire/libpakfire.sym index 22a8bfa5e..0a4e99ad1 100644 --- a/src/libpakfire/libpakfire.sym +++ b/src/libpakfire/libpakfire.sym @@ -302,13 +302,14 @@ global: # step pakfire_step_create; - pakfire_step_free; pakfire_step_get_downloadsize; pakfire_step_get_installsizechange; pakfire_step_get_package; pakfire_step_get_type; pakfire_step_get_type_string; pakfire_step_needs_download; + pakfire_step_ref; + pakfire_step_unref; # transaction pakfire_transaction_count; diff --git a/src/libpakfire/step.c b/src/libpakfire/step.c index c06b3f0a3..7ca1c87bb 100644 --- a/src/libpakfire/step.c +++ b/src/libpakfire/step.c @@ -25,6 +25,7 @@ #include #include +#include #include #include #include @@ -36,18 +37,41 @@ PAKFIRE_EXPORT PakfireStep pakfire_step_create(PakfireTransaction transaction, Id id) { PakfireStep step = pakfire_calloc(1, sizeof(*step)); + if (step) { + DEBUG("Allocated Step at %p\n", step); + step->nrefs = 1; - step->pool = pakfire_transaction_get_pool(transaction); - step->transaction = pakfire_transaction_ref(transaction); - step->id = id; + step->pool = pakfire_transaction_get_pool(transaction); + step->transaction = pakfire_transaction_ref(transaction); + step->id = id; + } + + return step; +} + +PAKFIRE_EXPORT PakfireStep pakfire_step_ref(PakfireStep step) { + step->nrefs++; return step; } -PAKFIRE_EXPORT void pakfire_step_free(PakfireStep step) { +static void pakfire_step_free(PakfireStep step) { pakfire_transaction_unref(step->transaction); pakfire_pool_unref(step->pool); pakfire_free(step); + + DEBUG("Released Step at %p\n", step); +} + +PAKFIRE_EXPORT PakfireStep pakfire_step_unref(PakfireStep step) { + if (!step) + return NULL; + + if (--step->nrefs > 0) + return step; + + pakfire_step_free(step); + return NULL; } PAKFIRE_EXPORT PakfirePackage pakfire_step_get_package(PakfireStep step) { diff --git a/src/libpakfire/transaction.c b/src/libpakfire/transaction.c index fb9d1a3e3..f103b4337 100644 --- a/src/libpakfire/transaction.c +++ b/src/libpakfire/transaction.c @@ -115,7 +115,7 @@ PAKFIRE_EXPORT ssize_t pakfire_transaction_downloadsize(PakfireTransaction trans PakfireStep step = pakfire_transaction_get_step(transaction, i); size += pakfire_step_get_downloadsize(step); - pakfire_step_free(step); + pakfire_step_unref(step); } return size; @@ -144,7 +144,7 @@ PAKFIRE_EXPORT PakfirePackageList pakfire_transaction_get_packages(PakfireTransa pakfire_package_unref(package); } - pakfire_step_free(step); + pakfire_step_unref(step); } // Sort list in place @@ -309,7 +309,7 @@ static int pakfire_transaction_run_steps(PakfireTransaction transaction, const p r = pakfire_step_run(step, action); // Free memory - pakfire_step_free(step); + pakfire_step_unref(step); // End loop if action was unsuccessful if (r) -- 2.39.5