]> git.ipfire.org Git - pakfire.git/commitdiff
repo: Add reference counting to appdata
authorMichael Tremer <michael.tremer@ipfire.org>
Fri, 31 Jan 2025 10:03:34 +0000 (10:03 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Fri, 31 Jan 2025 10:03:34 +0000 (10:03 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/pakfire/repo.c

index 1f2367167a862f27cb64fb322097319657cc8441..ac0219629566b6acc0ad3afc3703905e4ceeb2c5 100644 (file)
@@ -59,6 +59,9 @@
 #define MAX_KEY         4096
 
 struct pakfire_repo_appdata {
+       // Reference Counter
+       int nrefs;
+
        // Description
        char description[MAX_DESCRIPTION];
 
@@ -791,8 +794,11 @@ static int pakfire_repo_refresh_metadata(struct pakfire_repo* repo, const int fo
 }
 
 static void pakfire_repo_free_appdata(struct pakfire_repo_appdata* appdata) {
-       if (appdata)
-               free(appdata);
+       // Don't free if something is still holding references
+       if (--appdata->nrefs > 0)
+               return;
+
+       free(appdata);
 }
 
 static void pakfire_repo_free(struct pakfire_repo* self, const int free_repo) {
@@ -806,6 +812,8 @@ static void pakfire_repo_free(struct pakfire_repo* self, const int free_repo) {
                }
        }
 
+       if (self->appdata)
+               pakfire_repo_free_appdata(self->appdata);
        if (self->mirrorlist)
                pakfire_mirrorlist_unref(self->mirrorlist);
        if (self->pakfire)
@@ -841,6 +849,9 @@ static int pakfire_repo_setup_appdata(struct pakfire_repo* self) {
        if (!appdata)
                return -errno;
 
+       // Initialize the reference counter
+       appdata->nrefs = 2;
+
        // Refresh Interval: Set to invalid
        appdata->refresh = -1;
 
@@ -946,6 +957,7 @@ int pakfire_repo_open(struct pakfire_repo** repo, struct pakfire* pakfire, Repo*
 
        // Initialize appdata
        self->appdata = self->repo->appdata;
+       self->appdata->nrefs++;
 
        // Return the pointer
        *repo = self;