From: Michael Tremer Date: Wed, 30 Jun 2021 15:07:12 +0000 (+0000) Subject: packagelist: Refactor creating package lists X-Git-Tag: 0.9.28~1156 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0d8cb7174cf5fb0d5b780eac3609c9beb4ecdfd1;p=pakfire.git packagelist: Refactor creating package lists Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/include/pakfire/packagelist.h b/src/libpakfire/include/pakfire/packagelist.h index fac3f0b70..386a30580 100644 --- a/src/libpakfire/include/pakfire/packagelist.h +++ b/src/libpakfire/include/pakfire/packagelist.h @@ -25,7 +25,7 @@ struct pakfire_packagelist; -struct pakfire_packagelist* pakfire_packagelist_create(Pakfire pakfire); +int pakfire_packagelist_create(struct pakfire_packagelist** list, Pakfire pakfire); struct pakfire_packagelist* pakfire_packagelist_ref(struct pakfire_packagelist* list); struct pakfire_packagelist* pakfire_packagelist_unref(struct pakfire_packagelist* list); diff --git a/src/libpakfire/packagelist.c b/src/libpakfire/packagelist.c index cf0fb581d..9a58d1afd 100644 --- a/src/libpakfire/packagelist.c +++ b/src/libpakfire/packagelist.c @@ -43,15 +43,17 @@ struct pakfire_packagelist { size_t count; }; -PAKFIRE_EXPORT struct pakfire_packagelist* pakfire_packagelist_create(Pakfire pakfire) { - struct pakfire_packagelist* list = calloc(1, sizeof(*list)); - if (list) { - DEBUG(pakfire, "Allocated PackageList at %p\n", list); - list->pakfire = pakfire_ref(pakfire); - list->nrefs = 1; - } +PAKFIRE_EXPORT int pakfire_packagelist_create( + struct pakfire_packagelist** list, Pakfire pakfire) { + struct pakfire_packagelist* l = calloc(1, sizeof(*l)); + if (!l) + return 1; - return list; + l->pakfire = pakfire_ref(pakfire); + l->nrefs = 1; + + *list = l; + return 0; } PAKFIRE_EXPORT struct pakfire_packagelist* pakfire_packagelist_ref(struct pakfire_packagelist* list) { @@ -61,21 +63,17 @@ PAKFIRE_EXPORT struct pakfire_packagelist* pakfire_packagelist_ref(struct pakfir } static void pakfire_packagelist_free(struct pakfire_packagelist* list) { - DEBUG(list->pakfire, "Releasing PackageList at %p\n", list); - pakfire_unref(list->pakfire); - - for (unsigned int i = 0; i < list->count; i++) { - pakfire_package_unref(list->elements[i]); + if (list->elements) { + for (unsigned int i = 0; i < list->count; i++) + pakfire_package_unref(list->elements[i]); + free(list->elements); } - free(list->elements); + pakfire_unref(list->pakfire); free(list); } PAKFIRE_EXPORT struct pakfire_packagelist* pakfire_packagelist_unref(struct pakfire_packagelist* list) { - if (!list) - return NULL; - if (--list->nrefs > 0) return list; @@ -126,7 +124,12 @@ PAKFIRE_EXPORT void pakfire_packagelist_push_if_not_exists(struct pakfire_packag } PAKFIRE_EXPORT struct pakfire_packagelist* pakfire_packagelist_from_queue(Pakfire pakfire, Queue* q) { - struct pakfire_packagelist* list = pakfire_packagelist_create(pakfire); + struct pakfire_packagelist* list = NULL; + + // Create a new package list + int r = pakfire_packagelist_create(&list, pakfire); + if (r) + return NULL; for (int i = 0; i < q->count; i++) { PakfirePackage pkg = pakfire_package_create_from_solvable(pakfire, q->elements[i]); diff --git a/src/libpakfire/pakfire.c b/src/libpakfire/pakfire.c index ea6c4d9d8..209df5e9d 100644 --- a/src/libpakfire/pakfire.c +++ b/src/libpakfire/pakfire.c @@ -1286,7 +1286,12 @@ PakfireRepo pakfire_get_installed_repo(Pakfire pakfire) { } static struct pakfire_packagelist* pakfire_pool_dataiterator(Pakfire pakfire, const char* what, int key, int flags) { - struct pakfire_packagelist* list = pakfire_packagelist_create(pakfire); + struct pakfire_packagelist* list = NULL; + + int r = pakfire_packagelist_create(&list, pakfire); + if (r) + return NULL; + pakfire_pool_apply_changes(pakfire); int di_flags = 0; @@ -1312,8 +1317,13 @@ static struct pakfire_packagelist* pakfire_pool_dataiterator(Pakfire pakfire, co } static struct pakfire_packagelist* pakfire_search_name(Pakfire pakfire, const char* name, int flags) { + struct pakfire_packagelist* list = NULL; + if (!flags) { - struct pakfire_packagelist* list = pakfire_packagelist_create(pakfire); + int r = pakfire_packagelist_create(&list, pakfire); + if (r) + return NULL; + pakfire_pool_apply_changes(pakfire); Id id = pool_str2id(pakfire->pool, name, 0); @@ -1338,8 +1348,13 @@ static struct pakfire_packagelist* pakfire_search_name(Pakfire pakfire, const ch } static struct pakfire_packagelist* pakfire_search_provides(Pakfire pakfire, const char* provides, int flags) { + struct pakfire_packagelist* list = NULL; + if (!flags) { - struct pakfire_packagelist* list = pakfire_packagelist_create(pakfire); + int r = pakfire_packagelist_create(&list, pakfire); + if (r) + return NULL; + pakfire_pool_apply_changes(pakfire); Id id = pool_str2id(pakfire->pool, provides, 0);