]> git.ipfire.org Git - pakfire.git/commitdiff
libpakfire: Impement refcounting for Solution
authorMichael Tremer <michael.tremer@ipfire.org>
Mon, 15 Jan 2018 13:57:43 +0000 (14:57 +0100)
committerMichael Tremer <michael.tremer@ipfire.org>
Mon, 15 Jan 2018 13:57:43 +0000 (14:57 +0100)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/_pakfire/solution.c
src/libpakfire/include/pakfire/solution.h
src/libpakfire/libpakfire.sym
src/libpakfire/solution.c

index 34887dbe02e50275c622e28af2e75f4d10a0d80d..9475ed79957cfb4b55e149fa48443e546c37d2cb 100644 (file)
@@ -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);
 }
index 8f9a2ee7d6d9da6b309efa49a968512aa845d7f9..026491f4a8da864de9e4be86a8a56e28b483950e 100644 (file)
@@ -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);
index efbba3c7f32d35ecd09856184fef9462f10202c2..8cd220297549fef58cd3e914cb0c488706cf39e5 100644 (file)
@@ -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;
index 1a89abb0f8b003e87c9be6b80cdea5a0a01155dc..91819a6eadf4b6229652074067f3e7a4e9c827a2 100644 (file)
@@ -24,6 +24,7 @@
 
 #include <pakfire/constants.h>
 #include <pakfire/i18n.h>
+#include <pakfire/logging.h>
 #include <pakfire/private.h>
 #include <pakfire/problem.h>
 #include <pakfire/request.h>
@@ -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) {