]> git.ipfire.org Git - pakfire.git/commitdiff
libpakfire: Make Selector obscure and implement refcounting
authorMichael Tremer <michael.tremer@ipfire.org>
Mon, 15 Jan 2018 14:48:09 +0000 (15:48 +0100)
committerMichael Tremer <michael.tremer@ipfire.org>
Mon, 15 Jan 2018 14:48:09 +0000 (15:48 +0100)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/_pakfire/selector.c
src/libpakfire/include/pakfire/selector.h
src/libpakfire/libpakfire.sym
src/libpakfire/selector.c

index c0a85427cb7d1ce5cee4d74b5d95edcfb30b957d..770e26141f887362083289def6dd7a215eba1154 100644 (file)
@@ -41,8 +41,7 @@ static PyObject* Selector_new(PyTypeObject* type, PyObject* args, PyObject* kwds
 }
 
 static void Selector_dealloc(SelectorObject* self) {
-       if (self->selector)
-               pakfire_selector_free(self->selector);
+       pakfire_selector_unref(self->selector);
 
        Py_XDECREF(self->pool);
        Py_TYPE(self)->tp_free((PyObject *)self);
index cfc8048591a47ea3f8f6508cd7457b2e25c429b6..676ff3ed9e3480437992d2b9fcf0cbfdd44514d9 100644 (file)
@@ -29,7 +29,9 @@
 #include <pakfire/pool.h>
 
 PakfireSelector pakfire_selector_create(PakfirePool pool);
-void pakfire_selector_free(PakfireSelector selector);
+
+PakfireSelector pakfire_selector_ref(PakfireSelector selector);
+PakfireSelector pakfire_selector_unref(PakfireSelector selector);
 
 int pakfire_selector_set(PakfireSelector selector, int keyname, int cmp_type, const char* match);
 
@@ -37,20 +39,4 @@ PakfirePackageList pakfire_selector_providers(PakfireSelector selector);
 
 int pakfire_selector2queue(const PakfireSelector selector, Queue* queue, int solver_action);
 
-#ifdef PAKFIRE_PRIVATE
-
-struct _PakfireSelector {
-       PakfirePool pool;
-       PakfireFilter f_name;
-       PakfireFilter f_provides;
-       PakfireFilter f_evr;
-       PakfireFilter f_arch;
-};
-
-static inline Pool* pakfire_selector_solv_pool(PakfireSelector selector) {
-       return pakfire_pool_get_solv_pool(selector->pool);
-}
-
-#endif
-
 #endif /* PAKFIRE_SELECTOR_H */
index aadf50e6629acd45db01445f399eeb42212b5e40..06945bf22ea3a465cbbdc2c60733f3c2281075a4 100644 (file)
@@ -291,9 +291,10 @@ global:
 
        # selector
        pakfire_selector_create;
-       pakfire_selector_free;
        pakfire_selector_providers;
+       pakfire_selector_ref;
        pakfire_selector_set;
+       pakfire_selector_unref;
 
        # solution
        pakfire_solution_create;
index b70b899f5f023a4d79a757f848861a3d2de22244..9b313051fe804368ccb49868f2e19cf04bfe3c43 100644 (file)
@@ -26,6 +26,7 @@
 
 #include <pakfire/errno.h>
 #include <pakfire/filter.h>
+#include <pakfire/logging.h>
 #include <pakfire/package.h>
 #include <pakfire/packagelist.h>
 #include <pakfire/pool.h>
 #include <pakfire/types.h>
 #include <pakfire/util.h>
 
+struct _PakfireSelector {
+       PakfirePool pool;
+       PakfireFilter f_name;
+       PakfireFilter f_provides;
+       PakfireFilter f_evr;
+       PakfireFilter f_arch;
+       int nrefs;
+};
+
 PAKFIRE_EXPORT PakfireSelector pakfire_selector_create(PakfirePool pool) {
        PakfireSelector selector = pakfire_calloc(1, sizeof(*selector));
-       selector->pool = pool;
+       if (selector) {
+               DEBUG("Allocated Selector at %p\n", selector);
+               selector->nrefs = 1;
+
+               selector->pool = pakfire_pool_ref(pool);
+
+               selector->f_arch = NULL;
+               selector->f_name = NULL;
+               selector->f_evr = NULL;
+               selector->f_provides = NULL;
+       }
+
+       return selector;
+}
 
-       selector->f_arch = NULL;
-       selector->f_name = NULL;
-       selector->f_evr = NULL;
-       selector->f_provides = NULL;
+PAKFIRE_EXPORT PakfireSelector pakfire_selector_ref(PakfireSelector selector) {
+       selector->nrefs++;
 
        return selector;
 }
 
-PAKFIRE_EXPORT void pakfire_selector_free(PakfireSelector selector) {
+static void pakfire_selector_free(PakfireSelector selector) {
+       pakfire_pool_unref(selector->pool);
        pakfire_free(selector);
+
+       DEBUG("Released Selector at %p\n", selector);
+}
+
+PAKFIRE_EXPORT PakfireSelector pakfire_selector_unref(PakfireSelector selector) {
+       if (!selector)
+               return NULL;
+
+       if (--selector->nrefs > 0)
+               return selector;
+
+       pakfire_selector_free(selector);
+       return NULL;
 }
 
 static int pakfire_selector_valid_setting(int keyname, int cmp_type) {