From 6f94a65f08423573ed4427930a7cf0728df3fa38 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Mon, 15 Jan 2018 15:03:32 +0100 Subject: [PATCH] libpakfire: Implement refcounting for Problem Signed-off-by: Michael Tremer --- src/_pakfire/problem.c | 3 +- src/libpakfire/include/pakfire/problem.h | 2 +- src/libpakfire/libpakfire.sym | 2 +- src/libpakfire/problem.c | 38 ++++++++++++++---------- src/libpakfire/solution.c | 2 +- 5 files changed, 27 insertions(+), 20 deletions(-) diff --git a/src/_pakfire/problem.c b/src/_pakfire/problem.c index 1254a6073..51f5ca6c5 100644 --- a/src/_pakfire/problem.c +++ b/src/_pakfire/problem.c @@ -50,8 +50,7 @@ static PyObject* Problem_new(PyTypeObject* type, PyObject* args, PyObject* kwds) } static void Problem_dealloc(ProblemObject* self) { - if (self->problem) - pakfire_problem_free(self->problem); + pakfire_problem_unref(self->problem); Py_TYPE(self)->tp_free((PyObject *)self); } diff --git a/src/libpakfire/include/pakfire/problem.h b/src/libpakfire/include/pakfire/problem.h index dd78729a5..20c357ee6 100644 --- a/src/libpakfire/include/pakfire/problem.h +++ b/src/libpakfire/include/pakfire/problem.h @@ -28,7 +28,7 @@ PakfireProblem pakfire_problem_create(PakfireRequest request, Id id); PakfireProblem pakfire_problem_ref(PakfireProblem problem); -void pakfire_problem_free(PakfireProblem problem); +PakfireProblem pakfire_problem_unref(PakfireProblem problem); PakfireProblem pakfire_problem_next(PakfireProblem problem); void pakfire_problem_append(PakfireProblem problem, PakfireProblem new_problem); diff --git a/src/libpakfire/libpakfire.sym b/src/libpakfire/libpakfire.sym index 8cd220297..aadf50e66 100644 --- a/src/libpakfire/libpakfire.sym +++ b/src/libpakfire/libpakfire.sym @@ -212,11 +212,11 @@ global: # problem pakfire_problem_append; pakfire_problem_create; - pakfire_problem_free; pakfire_problem_get_solutions; pakfire_problem_next; pakfire_problem_ref; pakfire_problem_to_string; + pakfire_problem_unref; # repo pakfire_repo_cmp; diff --git a/src/libpakfire/problem.c b/src/libpakfire/problem.c index bd8d38d43..a9f18f6cd 100644 --- a/src/libpakfire/problem.c +++ b/src/libpakfire/problem.c @@ -20,6 +20,7 @@ #include #include +#include #include #include #include @@ -191,16 +192,16 @@ static char* to_string(PakfireProblem problem) { PAKFIRE_EXPORT PakfireProblem pakfire_problem_create(PakfireRequest request, Id id) { PakfireProblem problem = pakfire_calloc(1, sizeof(*problem)); + if (problem) { + DEBUG("Allocated Problem at %p\n", problem); + problem->nrefs = 1; - problem->request = pakfire_request_ref(request); - problem->id = id; + problem->request = pakfire_request_ref(request); + problem->id = id; - // Initialise reference counter - problem->nrefs = 1; - problem->next = NULL; - - // Extract information from solver - problem->string = to_string(problem); + // Extract information from solver + problem->string = to_string(problem); + } return problem; } @@ -211,19 +212,26 @@ PAKFIRE_EXPORT PakfireProblem pakfire_problem_ref(PakfireProblem problem) { return problem; } -PAKFIRE_EXPORT void pakfire_problem_free(PakfireProblem problem) { - if (--problem->nrefs > 0) - return; - - if (problem->next) - pakfire_problem_free(problem->next); - +static void pakfire_problem_free(PakfireProblem problem) { + pakfire_problem_unref(problem->next); pakfire_request_unref(problem->request); if (problem->string) pakfire_free(problem->string); pakfire_free(problem); + DEBUG("Released Problem at %p\n", problem); +} + +PAKFIRE_EXPORT PakfireProblem pakfire_problem_unref(PakfireProblem problem) { + if (!problem) + return NULL; + + if (--problem->nrefs > 0) + return problem; + + pakfire_problem_free(problem); + return NULL; } PAKFIRE_EXPORT PakfireProblem pakfire_problem_next(PakfireProblem problem) { diff --git a/src/libpakfire/solution.c b/src/libpakfire/solution.c index 91819a6ea..dc12ea79d 100644 --- a/src/libpakfire/solution.c +++ b/src/libpakfire/solution.c @@ -140,7 +140,7 @@ static void pakfire_solution_free(PakfireSolution solution) { if (solution->next) pakfire_solution_unref(solution->next); - pakfire_problem_free(solution->problem); + pakfire_problem_unref(solution->problem); if (solution->elements) while (*solution->elements) -- 2.39.5