From: Michael Tremer Date: Mon, 15 Jan 2018 13:57:43 +0000 (+0100) Subject: libpakfire: Impement refcounting for Solution X-Git-Tag: 0.9.28~1285^2~1194 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b8c2c773c6af3925e6e977cc1f412ce8b6595ff5;p=pakfire.git libpakfire: Impement refcounting for Solution Signed-off-by: Michael Tremer --- diff --git a/src/_pakfire/solution.c b/src/_pakfire/solution.c index 34887dbe0..9475ed799 100644 --- a/src/_pakfire/solution.c +++ b/src/_pakfire/solution.c @@ -49,8 +49,7 @@ static PyObject* Solution_new(PyTypeObject* type, PyObject* args, PyObject* kwds } static void Solution_dealloc(SolutionObject* self) { - if (self->solution) - pakfire_solution_free(self->solution); + pakfire_solution_unref(self->solution); Py_TYPE(self)->tp_free((PyObject *)self); } diff --git a/src/libpakfire/include/pakfire/solution.h b/src/libpakfire/include/pakfire/solution.h index 8f9a2ee7d..026491f4a 100644 --- a/src/libpakfire/include/pakfire/solution.h +++ b/src/libpakfire/include/pakfire/solution.h @@ -25,7 +25,7 @@ PakfireSolution pakfire_solution_create(PakfireProblem problem, Id id); PakfireSolution pakfire_solution_ref(PakfireSolution solution); -void pakfire_solution_free(PakfireSolution solution); +PakfireSolution pakfire_solution_unref(PakfireSolution solution); PakfireSolution pakfire_solution_next(PakfireSolution solution); void pakfire_solution_append(PakfireSolution solution, PakfireSolution new_solution); diff --git a/src/libpakfire/libpakfire.sym b/src/libpakfire/libpakfire.sym index efbba3c7f..8cd220297 100644 --- a/src/libpakfire/libpakfire.sym +++ b/src/libpakfire/libpakfire.sym @@ -297,10 +297,10 @@ global: # solution pakfire_solution_create; - pakfire_solution_free; pakfire_solution_next; pakfire_solution_ref; pakfire_solution_to_string; + pakfire_solution_unref; # step pakfire_step_create; diff --git a/src/libpakfire/solution.c b/src/libpakfire/solution.c index 1a89abb0f..91819a6ea 100644 --- a/src/libpakfire/solution.c +++ b/src/libpakfire/solution.c @@ -24,6 +24,7 @@ #include #include +#include #include #include #include @@ -115,16 +116,16 @@ static void import_elements(PakfireSolution solution) { PAKFIRE_EXPORT PakfireSolution pakfire_solution_create(PakfireProblem problem, Id id) { PakfireSolution solution = pakfire_calloc(1, sizeof(*solution)); + if (solution) { + DEBUG("Allocated Solution at %p\n", solution); + solution->nrefs = 1; - solution->problem = pakfire_problem_ref(problem); - solution->id = id; + solution->problem = pakfire_problem_ref(problem); + solution->id = id; - // Initialise reference counter - solution->nrefs = 1; - solution->next = NULL; - - // Extract information from solver - import_elements(solution); + // Extract information from solver + import_elements(solution); + } return solution; } @@ -135,12 +136,9 @@ PAKFIRE_EXPORT PakfireSolution pakfire_solution_ref(PakfireSolution solution) { return solution; } -PAKFIRE_EXPORT void pakfire_solution_free(PakfireSolution solution) { - if (--solution->nrefs > 0) - return; - +static void pakfire_solution_free(PakfireSolution solution) { if (solution->next) - pakfire_solution_free(solution->next); + pakfire_solution_unref(solution->next); pakfire_problem_free(solution->problem); @@ -149,6 +147,18 @@ PAKFIRE_EXPORT void pakfire_solution_free(PakfireSolution solution) { pakfire_free(*solution->elements++); pakfire_free(solution); + DEBUG("Released Solution at %p\n", solution); +} + +PAKFIRE_EXPORT PakfireSolution pakfire_solution_unref(PakfireSolution solution) { + if (!solution) + return NULL; + + if (--solution->nrefs > 0) + return solution; + + pakfire_solution_free(solution); + return NULL; } PAKFIRE_EXPORT PakfireSolution pakfire_solution_next(PakfireSolution solution) {