]> git.ipfire.org Git - pakfire.git/commitdiff
libpakfire: Make PakfireTransaction obscure
authorMichael Tremer <michael.tremer@ipfire.org>
Sat, 13 Jan 2018 14:37:04 +0000 (15:37 +0100)
committerMichael Tremer <michael.tremer@ipfire.org>
Sat, 13 Jan 2018 14:37:04 +0000 (15:37 +0100)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/_pakfire/transaction.c
src/libpakfire/include/pakfire/transaction.h
src/libpakfire/libpakfire.sym
src/libpakfire/step.c
src/libpakfire/transaction.c

index c7e461b75ad6418416b5815631967d5be994366f..5458ae14632952e54c758e9a6f732432dca5839c 100644 (file)
@@ -59,7 +59,7 @@ static PyObject* Transaction_new(PyTypeObject* type, PyObject* args, PyObject* k
 
 static void Transaction_dealloc(TransactionObject* self) {
        if (self->transaction)
-               pakfire_transaction_free(self->transaction);
+               pakfire_transaction_unref(self->transaction);
 
        Py_XDECREF(self->request);
        Py_TYPE(self)->tp_free((PyObject *)self);
index 352303b8cc67302befa73a16626b582131d49a29..952cd40ff65c6d29176fff681a3d422b51ea09cf 100644 (file)
 #include <pakfire/types.h>
 
 PakfireTransaction pakfire_transaction_create(PakfirePool pool, Transaction* trans);
-void pakfire_transaction_free(PakfireTransaction transaction);
+PakfireTransaction pakfire_transaction_ref(PakfireTransaction transaction);
+PakfireTransaction pakfire_transaction_unref(PakfireTransaction transaction);
 
+PakfirePool pakfire_transaction_get_pool(PakfireTransaction transaction);
 size_t pakfire_transaction_count(PakfireTransaction transaction);
 
 ssize_t pakfire_transaction_installsizechange(PakfireTransaction transaction);
@@ -49,14 +51,7 @@ typedef enum _pakfire_action_types {
        PAKFIRE_ACTION_POSTTRANS = 1 << 3,
 } pakfire_action_type;
 
-struct _PakfireTransaction {
-       PakfirePool pool;
-       Transaction* transaction;
-};
-
-static inline PakfirePool pakfire_transaction_pool(PakfireTransaction transaction) {
-       return transaction->pool;
-}
+Transaction* pakfire_transaction_get_transaction(PakfireTransaction transaction);
 
 #endif
 
index af4c8b7155e3d56f0b060b83d16a8280aa8a905d..7be27e1e388f7c359a923bb2aafed4ffdb6273ba 100644 (file)
@@ -313,11 +313,12 @@ global:
        pakfire_transaction_count;
        pakfire_transaction_create;
        pakfire_transaction_dump;
-       pakfire_transaction_free;
        pakfire_transaction_get_packages;
        pakfire_transaction_get_step;
        pakfire_transaction_installsizechange;
+       pakfire_transaction_ref;
        pakfire_transaction_run;
+       pakfire_transaction_unref;
 
        # util
        pakfire_access;
index dfd1388b09628c4bb7307db430c89ea7ed17084e..20b88e250d7988e3cef7bab951858f4b89bb003c 100644 (file)
@@ -26,6 +26,7 @@
 #include <pakfire/cache.h>
 #include <pakfire/constants.h>
 #include <pakfire/package.h>
+#include <pakfire/pool.h>
 #include <pakfire/private.h>
 #include <pakfire/repo.h>
 #include <pakfire/step.h>
@@ -36,7 +37,7 @@
 PAKFIRE_EXPORT PakfireStep pakfire_step_create(PakfireTransaction transaction, Id id) {
        PakfireStep step = pakfire_calloc(1, sizeof(*step));
 
-       step->pool = pakfire_transaction_pool(transaction);
+       step->pool = pakfire_transaction_get_pool(transaction);
        step->transaction = transaction;
        step->id = id;
 
@@ -44,6 +45,7 @@ PAKFIRE_EXPORT PakfireStep pakfire_step_create(PakfireTransaction transaction, I
 }
 
 PAKFIRE_EXPORT void pakfire_step_free(PakfireStep step) {
+       pakfire_pool_unref(step->pool);
        pakfire_free(step);
 }
 
@@ -52,7 +54,7 @@ PAKFIRE_EXPORT PakfirePackage pakfire_step_get_package(PakfireStep step) {
 }
 
 PAKFIRE_EXPORT pakfire_step_type pakfire_step_get_type(PakfireStep step) {
-       Transaction* trans = step->transaction->transaction;
+       Transaction* trans = pakfire_transaction_get_transaction(step->transaction);
 
        int type = transaction_type(trans, step->id,
                SOLVER_TRANSACTION_SHOW_ACTIVE|SOLVER_TRANSACTION_CHANGE_IS_REINSTALL);
index c3767a05e6c322d031c575bdf3b1b87559d7897a..2f4823b865e3b2424251e30f92d5664020914691 100644 (file)
 #include <solv/transaction.h>
 
 #include <pakfire/i18n.h>
+#include <pakfire/logging.h>
 #include <pakfire/package.h>
 #include <pakfire/packagelist.h>
+#include <pakfire/pool.h>
 #include <pakfire/private.h>
 #include <pakfire/repo.h>
 #include <pakfire/step.h>
 #include <pakfire/types.h>
 #include <pakfire/util.h>
 
+struct _PakfireTransaction {
+       PakfirePool pool;
+       Transaction* transaction;
+
+       int nrefs;
+};
+
 PAKFIRE_EXPORT PakfireTransaction pakfire_transaction_create(PakfirePool pool, Transaction* trans) {
        PakfireTransaction transaction = pakfire_calloc(1, sizeof(*transaction));
-       transaction->pool = pool;
+       if (!transaction)
+               return NULL;
+
+       transaction->pool = pakfire_pool_ref(pool);
+       transaction->nrefs = 1;
 
        // Clone the transaction, so we get independent from what ever called this.
        if (trans) {
@@ -46,11 +59,40 @@ PAKFIRE_EXPORT PakfireTransaction pakfire_transaction_create(PakfirePool pool, T
        return transaction;
 }
 
-PAKFIRE_EXPORT void pakfire_transaction_free(PakfireTransaction transaction) {
+PAKFIRE_EXPORT PakfireTransaction pakfire_transaction_ref(PakfireTransaction transaction) {
+       if (!transaction)
+               return NULL;
+
+       transaction->nrefs++;
+       return transaction;
+}
+
+void pakfire_transaction_free(PakfireTransaction transaction) {
+       pakfire_pool_unref(transaction->pool);
+
        transaction_free(transaction->transaction);
        pakfire_free(transaction);
 }
 
+PAKFIRE_EXPORT PakfireTransaction pakfire_transaction_unref(PakfireTransaction transaction) {
+       if (!transaction)
+               return NULL;
+
+       if (--transaction->nrefs > 0)
+               return transaction;
+
+       pakfire_transaction_free(transaction);
+       return NULL;
+}
+
+PAKFIRE_EXPORT PakfirePool pakfire_transaction_get_pool(PakfireTransaction transaction) {
+       return pakfire_pool_ref(transaction->pool);
+}
+
+Transaction* pakfire_transaction_get_transaction(PakfireTransaction transaction) {
+       return transaction->transaction;
+}
+
 PAKFIRE_EXPORT size_t pakfire_transaction_count(PakfireTransaction transaction) {
        return transaction->transaction->steps.count;
 }
@@ -63,7 +105,6 @@ PAKFIRE_EXPORT ssize_t pakfire_transaction_installsizechange(PakfireTransaction
 }
 
 PAKFIRE_EXPORT ssize_t pakfire_transaction_downloadsize(PakfireTransaction transaction) {
-       PakfirePool pool = pakfire_transaction_pool(transaction);
        ssize_t size = 0;
 
        for (int i = 0; i < transaction->transaction->steps.count; i++) {
@@ -79,7 +120,7 @@ PAKFIRE_EXPORT ssize_t pakfire_transaction_downloadsize(PakfireTransaction trans
                        continue;
 
                // Get the package for this step
-               PakfirePackage pkg = pakfire_package_create(pool, p);
+               PakfirePackage pkg = pakfire_package_create(transaction->pool, p);
 
                if (!pakfire_package_is_cached(pkg))
                        size += pakfire_package_get_downloadsize(pkg);
@@ -100,8 +141,6 @@ PAKFIRE_EXPORT PakfireStep pakfire_transaction_get_step(PakfireTransaction trans
 }
 
 PAKFIRE_EXPORT PakfirePackageList pakfire_transaction_get_packages(PakfireTransaction transaction, int type) {
-       PakfirePool pool = pakfire_transaction_pool(transaction);
-
        PakfirePackageList packagelist = pakfire_packagelist_create();
 
        for (int i = 0; i < transaction->transaction->steps.count; i++) {
@@ -113,7 +152,7 @@ PAKFIRE_EXPORT PakfirePackageList pakfire_transaction_get_packages(PakfireTransa
                        SOLVER_TRANSACTION_SHOW_ACTIVE);
 
                if (t == type) {
-                       PakfirePackage package = pakfire_package_create(pool, p);
+                       PakfirePackage package = pakfire_package_create(transaction->pool, p);
                        pakfire_packagelist_push(packagelist, package);
                }
        }
@@ -263,6 +302,8 @@ PAKFIRE_EXPORT char* pakfire_transaction_dump(PakfireTransaction transaction, si
        if (l > 0 && string[l] == '\n')
                string[l] = '\0';
 
+       DEBUG("Transaction: %s\n", string);
+
        return string;
 }