From: Michael Tremer Date: Fri, 23 Apr 2021 16:24:54 +0000 (+0000) Subject: config: Add reference counting X-Git-Tag: 0.9.28~1285^2~235 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=59106773f74147550f4886aab187b08f7dea569a;p=pakfire.git config: Add reference counting Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/config.c b/src/libpakfire/config.c index 5bddb45df..5504aa626 100644 --- a/src/libpakfire/config.c +++ b/src/libpakfire/config.c @@ -44,6 +44,8 @@ struct pakfire_config_entry { }; struct pakfire_config { + int nrefs; + STAILQ_HEAD(entries, pakfire_config_entry) entries; }; @@ -63,7 +65,7 @@ static void pakfire_config_entry_free(struct pakfire_config_entry* entry) { free(entry); } -void pakfire_config_free(struct pakfire_config* config) { +static void pakfire_config_free(struct pakfire_config* config) { while (!STAILQ_EMPTY(&config->entries)) { struct pakfire_config_entry* entry = STAILQ_FIRST(&config->entries); STAILQ_REMOVE_HEAD(&config->entries, nodes); @@ -74,6 +76,20 @@ void pakfire_config_free(struct pakfire_config* config) { free(config); } +struct pakfire_config* pakfire_config_ref(struct pakfire_config* config) { + config->nrefs++; + + return config; +} + +struct pakfire_config* pakfire_config_unref(struct pakfire_config* config) { + if (--config->nrefs > 0) + return config; + + pakfire_config_free(config); + return NULL; +} + static struct pakfire_config_entry* pakfire_config_create_entry( struct pakfire_config* config, const char* section, const char* key) { struct pakfire_config_entry* entry = calloc(1, sizeof(*entry)); diff --git a/src/libpakfire/include/pakfire/config.h b/src/libpakfire/include/pakfire/config.h index f87fff122..d424603a0 100644 --- a/src/libpakfire/include/pakfire/config.h +++ b/src/libpakfire/include/pakfire/config.h @@ -28,7 +28,8 @@ struct pakfire_config; int pakfire_config_create(struct pakfire_config** config); -void pakfire_config_free(struct pakfire_config* config); +struct pakfire_config* pakfire_config_ref(struct pakfire_config* config); +struct pakfire_config* pakfire_config_unref(struct pakfire_config* config); int pakfire_config_set(struct pakfire_config* config, const char* section, const char* key, const char* value); diff --git a/src/libpakfire/include/pakfire/pakfire.h b/src/libpakfire/include/pakfire/pakfire.h index 29d2609be..3383911c7 100644 --- a/src/libpakfire/include/pakfire/pakfire.h +++ b/src/libpakfire/include/pakfire/pakfire.h @@ -89,6 +89,10 @@ int pakfire_read_makefile(PakfireParser* parser, Pakfire pakfire, const char* pa #include +#include + +struct pakfire_config* pakfire_get_config(Pakfire pakfire); + #define pakfire_make_path(pakfire, dst, path) \ __pakfire_make_path(pakfire, dst, sizeof(dst) - 1, path) int __pakfire_make_path(Pakfire pakfire, char* dst, size_t length, const char* path); diff --git a/src/libpakfire/pakfire.c b/src/libpakfire/pakfire.c index 07a9d533d..08a30a4e2 100644 --- a/src/libpakfire/pakfire.c +++ b/src/libpakfire/pakfire.c @@ -392,7 +392,7 @@ static void pakfire_free(Pakfire pakfire) { queue_free(&pakfire->installonly); if (pakfire->config) - pakfire_config_free(pakfire->config); + pakfire_config_unref(pakfire->config); free(pakfire); } @@ -796,6 +796,13 @@ PAKFIRE_EXPORT Pakfire pakfire_unref(Pakfire pakfire) { return NULL; } +struct pakfire_config* pakfire_get_config(Pakfire pakfire) { + if (pakfire->config) + return pakfire_config_ref(pakfire->config); + + return NULL; +} + PAKFIRE_EXPORT const char* pakfire_get_path(Pakfire pakfire) { return pakfire->path; }