]> git.ipfire.org Git - pakfire.git/commitdiff
config: Add reference counting
authorMichael Tremer <michael.tremer@ipfire.org>
Fri, 23 Apr 2021 16:24:54 +0000 (16:24 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Fri, 23 Apr 2021 16:24:54 +0000 (16:24 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/config.c
src/libpakfire/include/pakfire/config.h
src/libpakfire/include/pakfire/pakfire.h
src/libpakfire/pakfire.c

index 5bddb45df86e9d5e558adfb66f50b3ac81fbc1b9..5504aa626714faa979d320968d45547d5c426a2a 100644 (file)
@@ -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));
index f87fff122f24cb39b7ddfda9c69503d5d117aacf..d424603a02608d203ac5e165ba9ea3bad3fd4d97 100644 (file)
@@ -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);
index 29d2609be6bb711000e139deeb8ccdc140d24d51..3383911c74e6fbb91fbd0947d9a10849385a2537 100644 (file)
@@ -89,6 +89,10 @@ int pakfire_read_makefile(PakfireParser* parser, Pakfire pakfire, const char* pa
 
 #include <solv/pool.h>
 
+#include <pakfire/config.h>
+
+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);
index 07a9d533d9caf8dd4677e7e552c2562f6593334e..08a30a4e25d26828a7e8d42df84f855e135a9f44 100644 (file)
@@ -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;
 }