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

index 1254a60730e884218eccce0c18ea0d05d2108bc6..51f5ca6c54aa0dbe113aa37248fd53c47074a09a 100644 (file)
@@ -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);
 }
index dd78729a54acf90d300650f8b19a3c0075964066..20c357ee61eae1b3ba5b5c07149922c8a3aa43b6 100644 (file)
@@ -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);
index 8cd220297549fef58cd3e914cb0c488706cf39e5..aadf50e6629acd45db01445f399eeb42212b5e40 100644 (file)
@@ -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;
index bd8d38d431ce796a1e0212f0babd851d7efb122f..a9f18f6cd87c91bea6c5a094f561924cf5c6b4a5 100644 (file)
@@ -20,6 +20,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>
@@ -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) {
index 91819a6eadf4b6229652074067f3e7a4e9c827a2..dc12ea79d5829015eb2392fcd7cdc2b23a90b0d3 100644 (file)
@@ -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)