From 4347c271e4748f08531248d90e765f1c1b181dad Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Mon, 15 Jan 2018 15:48:09 +0100 Subject: [PATCH] libpakfire: Make Selector obscure and implement refcounting Signed-off-by: Michael Tremer --- src/_pakfire/selector.c | 3 +- src/libpakfire/include/pakfire/selector.h | 20 ++-------- src/libpakfire/libpakfire.sym | 3 +- src/libpakfire/selector.c | 47 ++++++++++++++++++++--- 4 files changed, 47 insertions(+), 26 deletions(-) diff --git a/src/_pakfire/selector.c b/src/_pakfire/selector.c index c0a85427c..770e26141 100644 --- a/src/_pakfire/selector.c +++ b/src/_pakfire/selector.c @@ -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); diff --git a/src/libpakfire/include/pakfire/selector.h b/src/libpakfire/include/pakfire/selector.h index cfc804859..676ff3ed9 100644 --- a/src/libpakfire/include/pakfire/selector.h +++ b/src/libpakfire/include/pakfire/selector.h @@ -29,7 +29,9 @@ #include 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 */ diff --git a/src/libpakfire/libpakfire.sym b/src/libpakfire/libpakfire.sym index aadf50e66..06945bf22 100644 --- a/src/libpakfire/libpakfire.sym +++ b/src/libpakfire/libpakfire.sym @@ -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; diff --git a/src/libpakfire/selector.c b/src/libpakfire/selector.c index b70b899f5..9b313051f 100644 --- a/src/libpakfire/selector.c +++ b/src/libpakfire/selector.c @@ -26,6 +26,7 @@ #include #include +#include #include #include #include @@ -34,20 +35,54 @@ #include #include +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) { -- 2.39.5