]> git.ipfire.org Git - pakfire.git/commitdiff
libpakfire: Implement refcounting in Step
authorMichael Tremer <michael.tremer@ipfire.org>
Sun, 14 Jan 2018 17:13:53 +0000 (18:13 +0100)
committerMichael Tremer <michael.tremer@ipfire.org>
Sun, 14 Jan 2018 17:13:53 +0000 (18:13 +0100)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/_pakfire/step.c
src/libpakfire/include/pakfire/step.h
src/libpakfire/libpakfire.sym
src/libpakfire/step.c
src/libpakfire/transaction.c

index 4406e0690d14fe8b387a70412e0e33eb6645fe68..612febb41bd5a8c6a24f464ecd76f2669a109ef9 100644 (file)
@@ -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);
index 70f43a7fffd2d0300e7ebef43b76a1448cdac206..76b433af632a30fb72dc7cd9aef12592d5b618a1 100644 (file)
@@ -26,7 +26,8 @@
 #include <pakfire/types.h>
 
 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) {
index 22a8bfa5ed7f9fe2f0d6a956bbff0d01532be982..0a4e99ad1e1fb4572692b0eaee3dbb318a6dc0cd 100644 (file)
@@ -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;
index c06b3f0a31f29c3d61341ba7f0dfd65ec14551ca..7ca1c87bb87cce7daf17f7763bc89c8b3023a7e5 100644 (file)
@@ -25,6 +25,7 @@
 
 #include <pakfire/cache.h>
 #include <pakfire/constants.h>
+#include <pakfire/logging.h>
 #include <pakfire/package.h>
 #include <pakfire/pool.h>
 #include <pakfire/private.h>
 
 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) {
index fb9d1a3e39092241437eb7885447328bc7947821..f103b4337d8e2da91a734b020f99b9f9f011c45c 100644 (file)
@@ -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)