From: Michael Tremer Date: Fri, 31 Jan 2025 10:03:34 +0000 (+0000) Subject: repo: Add reference counting to appdata X-Git-Tag: 0.9.30~223 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8dbe0483a5fc69228aaaf8b41162cbeea1e6a15f;p=pakfire.git repo: Add reference counting to appdata Signed-off-by: Michael Tremer --- diff --git a/src/pakfire/repo.c b/src/pakfire/repo.c index 1f236716..ac021962 100644 --- a/src/pakfire/repo.c +++ b/src/pakfire/repo.c @@ -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;