From: Michael Tremer Date: Sun, 14 Jan 2018 19:03:25 +0000 (+0100) Subject: libpakfire: Make Request obscure X-Git-Tag: 0.9.28~1285^2~1196 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=e3993ac684d86ab83e4e1e360a20ea388b59f85b;p=pakfire.git libpakfire: Make Request obscure Signed-off-by: Michael Tremer --- diff --git a/src/_pakfire/_pakfiremodule.c b/src/_pakfire/_pakfiremodule.c index d2c436791..ca19a1426 100644 --- a/src/_pakfire/_pakfiremodule.c +++ b/src/_pakfire/_pakfiremodule.c @@ -25,6 +25,8 @@ #include #include +#include + #include "archive.h" #include "capabilities.h" #include "constants.h" diff --git a/src/_pakfire/request.c b/src/_pakfire/request.c index 05c957aa0..a79f18188 100644 --- a/src/_pakfire/request.c +++ b/src/_pakfire/request.c @@ -44,7 +44,7 @@ static PyObject* Request_new(PyTypeObject* type, PyObject* args, PyObject* kwds) static void Request_dealloc(RequestObject* self) { if (self->request) - pakfire_request_free(self->request); + pakfire_request_unref(self->request); Py_XDECREF(self->pool); Py_TYPE(self)->tp_free((PyObject *)self); diff --git a/src/_pakfire/transaction.c b/src/_pakfire/transaction.c index 5458ae146..30effc904 100644 --- a/src/_pakfire/transaction.c +++ b/src/_pakfire/transaction.c @@ -22,6 +22,7 @@ #include #include +#include #include #include "package.h" @@ -79,9 +80,10 @@ static int Transaction_init(TransactionObject* self, PyObject* args, PyObject* k // If request has got no transaction, we will create an (empty) new one. if (!self->transaction) { - PakfirePool pool = pakfire_request_pool(req); + PakfirePool pool = pakfire_request_get_pool(req); self->transaction = pakfire_transaction_create(pool, NULL); + pakfire_pool_unref(pool); } return 0; diff --git a/src/libpakfire/include/pakfire/request.h b/src/libpakfire/include/pakfire/request.h index 9343bbf58..b4a4e5b6b 100644 --- a/src/libpakfire/include/pakfire/request.h +++ b/src/libpakfire/include/pakfire/request.h @@ -22,7 +22,6 @@ #define PAKFIRE_REQUEST_H #include -#include #include #include @@ -42,10 +41,11 @@ enum _pakfire_solver_flags { }; PakfireRequest pakfire_request_create(PakfirePool pool); + PakfireRequest pakfire_request_ref(PakfireRequest request); -void pakfire_request_free(PakfireRequest request); +PakfireRequest pakfire_request_unref(PakfireRequest request); -PakfirePool pakfire_request_pool(PakfireRequest request); +PakfirePool pakfire_request_get_pool(PakfireRequest request); int pakfire_request_solve(PakfireRequest request, int flags); PakfireProblem pakfire_request_get_problems(PakfireRequest request); @@ -74,13 +74,9 @@ int pakfire_request_verify(PakfireRequest request); #ifdef PAKFIRE_PRIVATE -struct _PakfireRequest { - PakfirePool pool; - Queue queue; - Solver* solver; - Transaction* transaction; - int nrefs; -}; +#include + +Solver* pakfire_request_get_solver(PakfireRequest request); #endif diff --git a/src/libpakfire/libpakfire.sym b/src/libpakfire/libpakfire.sym index 1c62456dd..efbba3c7f 100644 --- a/src/libpakfire/libpakfire.sym +++ b/src/libpakfire/libpakfire.sym @@ -268,10 +268,10 @@ global: # request pakfire_request_create; pakfire_request_distupgrade; - pakfire_request_free; pakfire_request_erase; pakfire_request_erase_relation; pakfire_request_erase_selector; + pakfire_request_get_pool; pakfire_request_get_problems; pakfire_request_get_transaction; pakfire_request_install; @@ -280,12 +280,13 @@ global: pakfire_request_lock; pakfire_request_lock_relation; pakfire_request_lock_selector; - pakfire_request_pool; + pakfire_request_ref; pakfire_request_solve; pakfire_request_upgrade; pakfire_request_upgrade_all; pakfire_request_upgrade_relation; pakfire_request_upgrade_selector; + pakfire_request_unref; pakfire_request_verify; # selector diff --git a/src/libpakfire/problem.c b/src/libpakfire/problem.c index 7cfec1a05..bd8d38d43 100644 --- a/src/libpakfire/problem.c +++ b/src/libpakfire/problem.c @@ -27,7 +27,7 @@ #include static char* to_string(PakfireProblem problem) { - Solver* solver = problem->request->solver; + Solver* solver = pakfire_request_get_solver(problem->request); Pool* pool = solver->pool; // Get the problem rule @@ -218,7 +218,7 @@ PAKFIRE_EXPORT void pakfire_problem_free(PakfireProblem problem) { if (problem->next) pakfire_problem_free(problem->next); - pakfire_request_free(problem->request); + pakfire_request_unref(problem->request); if (problem->string) pakfire_free(problem->string); @@ -247,9 +247,10 @@ PAKFIRE_EXPORT const char* pakfire_problem_to_string(PakfireProblem problem) { PAKFIRE_EXPORT PakfireSolution pakfire_problem_get_solutions(PakfireProblem problem) { PakfireSolution ret = NULL; + Solver* solver = pakfire_request_get_solver(problem->request); Id solution = 0; - while ((solution = solver_next_solution(problem->request->solver, problem->id, solution)) != 0) { + while ((solution = solver_next_solution(solver, problem->id, solution)) != 0) { PakfireSolution s = pakfire_solution_create(problem, solution); if (ret) diff --git a/src/libpakfire/request.c b/src/libpakfire/request.c index c241766c1..9a6eb11c9 100644 --- a/src/libpakfire/request.c +++ b/src/libpakfire/request.c @@ -36,14 +36,23 @@ #include #include +struct _PakfireRequest { + PakfirePool pool; + Queue queue; + Solver* solver; + Transaction* transaction; + int nrefs; +}; + PAKFIRE_EXPORT PakfireRequest pakfire_request_create(PakfirePool pool) { PakfireRequest request = pakfire_calloc(1, sizeof(*request)); - request->pool = pool; + if (request) { + DEBUG("Allocated Request at %p\n", request); + request->nrefs = 1; - queue_init(&request->queue); - - // Initialise reference counter - request->nrefs = 1; + request->pool = pakfire_pool_ref(pool); + queue_init(&request->queue); + } return request; } @@ -54,9 +63,8 @@ PAKFIRE_EXPORT PakfireRequest pakfire_request_ref(PakfireRequest request) { return request; } -PAKFIRE_EXPORT void pakfire_request_free(PakfireRequest request) { - if (--request->nrefs > 0) - return; +static void pakfire_request_free(PakfireRequest request) { + pakfire_pool_unref(request->pool); if (request->transaction) transaction_free(request->transaction); @@ -65,17 +73,32 @@ PAKFIRE_EXPORT void pakfire_request_free(PakfireRequest request) { solver_free(request->solver); queue_free(&request->queue); - pakfire_free(request); + + DEBUG("Released Request at %p\n", request); +} + +PAKFIRE_EXPORT PakfireRequest pakfire_request_unref(PakfireRequest request) { + if (!request) + return NULL; + + if (--request->nrefs > 0) + return request; + + pakfire_request_free(request); + return NULL; +} + +PAKFIRE_EXPORT PakfirePool pakfire_request_get_pool(PakfireRequest request) { + return pakfire_pool_ref(request->pool); } -PAKFIRE_EXPORT PakfirePool pakfire_request_pool(PakfireRequest request) { - return request->pool; +Solver* pakfire_request_get_solver(PakfireRequest request) { + return request->solver; } static void init_solver(PakfireRequest request, int flags) { - PakfirePool pool = pakfire_request_pool(request); - Pool* p = pakfire_pool_get_solv_pool(pool); + Pool* p = pakfire_pool_get_solv_pool(request->pool); Solver* solver = solver_create(p); diff --git a/src/libpakfire/solution.c b/src/libpakfire/solution.c index 269dfd137..6105a787a 100644 --- a/src/libpakfire/solution.c +++ b/src/libpakfire/solution.c @@ -26,11 +26,12 @@ #include #include #include +#include #include #include static void import_elements(PakfireSolution solution) { - Solver* solver = solution->problem->request->solver; + Solver* solver = pakfire_request_get_solver(solution->problem->request); Pool* pool = solver->pool; // Reserve memory