From 2ee86b5fe8bdfdee9e41156fa670d8212dfd0baa Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Sat, 13 Jan 2018 15:37:04 +0100 Subject: [PATCH] libpakfire: Make PakfireTransaction obscure Signed-off-by: Michael Tremer --- src/_pakfire/transaction.c | 2 +- src/libpakfire/include/pakfire/transaction.h | 13 ++--- src/libpakfire/libpakfire.sym | 3 +- src/libpakfire/step.c | 6 ++- src/libpakfire/transaction.c | 55 +++++++++++++++++--- 5 files changed, 59 insertions(+), 20 deletions(-) diff --git a/src/_pakfire/transaction.c b/src/_pakfire/transaction.c index c7e461b75..5458ae146 100644 --- a/src/_pakfire/transaction.c +++ b/src/_pakfire/transaction.c @@ -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); diff --git a/src/libpakfire/include/pakfire/transaction.h b/src/libpakfire/include/pakfire/transaction.h index 352303b8c..952cd40ff 100644 --- a/src/libpakfire/include/pakfire/transaction.h +++ b/src/libpakfire/include/pakfire/transaction.h @@ -26,8 +26,10 @@ #include 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 diff --git a/src/libpakfire/libpakfire.sym b/src/libpakfire/libpakfire.sym index af4c8b715..7be27e1e3 100644 --- a/src/libpakfire/libpakfire.sym +++ b/src/libpakfire/libpakfire.sym @@ -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; diff --git a/src/libpakfire/step.c b/src/libpakfire/step.c index dfd1388b0..20b88e250 100644 --- a/src/libpakfire/step.c +++ b/src/libpakfire/step.c @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -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); diff --git a/src/libpakfire/transaction.c b/src/libpakfire/transaction.c index c3767a05e..2f4823b86 100644 --- a/src/libpakfire/transaction.c +++ b/src/libpakfire/transaction.c @@ -22,8 +22,10 @@ #include #include +#include #include #include +#include #include #include #include @@ -31,9 +33,20 @@ #include #include +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; } -- 2.39.5