#include <pakfire/types.h>
PakfirePackageList pakfire_packagelist_create(void);
-void pakfire_packagelist_free(PakfirePackageList list);
+PakfirePackageList pakfire_packagelist_ref(PakfirePackageList list);
+PakfirePackageList pakfire_packagelist_unref(PakfirePackageList list);
-int pakfire_packagelist_count(PakfirePackageList list);
+size_t pakfire_packagelist_count(PakfirePackageList list);
void pakfire_packagelist_sort(PakfirePackageList list);
int pakfire_packagelist_has(PakfirePackageList list, PakfirePackage pkg);
-PakfirePackage pakfire_packagelist_get(PakfirePackageList list, int index);
+PakfirePackage pakfire_packagelist_get(PakfirePackageList list, unsigned int index);
void pakfire_packagelist_push(PakfirePackageList list, PakfirePackage pkg);
void pakfire_packagelist_push_if_not_exists(PakfirePackageList list, PakfirePackage pkg);
#ifdef PAKFIRE_PRIVATE
-struct _PakfirePackageList {
- PakfirePackage* elements;
- int count;
-};
-
PakfirePackageList pakfire_packagelist_from_queue(PakfirePool _pool, Queue* q);
#endif
# packagelist
pakfire_packagelist_count;
pakfire_packagelist_create;
- pakfire_packagelist_free;
pakfire_packagelist_get;
pakfire_packagelist_has;
pakfire_packagelist_push;
pakfire_packagelist_push_if_not_exists;
+ pakfire_packagelist_ref;
pakfire_packagelist_sort;
+ pakfire_packagelist_unref;
# pool
pakfire_pool_count;
#include <solv/solver.h>
#include <solv/util.h>
+#include <pakfire/logging.h>
#include <pakfire/package.h>
#include <pakfire/packagelist.h>
#include <pakfire/private.h>
#define BLOCK_SIZE 31
+struct _PakfirePackageList {
+ PakfirePackage* elements;
+ size_t count;
+ int nrefs;
+};
+
PAKFIRE_EXPORT PakfirePackageList pakfire_packagelist_create(void) {
PakfirePackageList list = pakfire_calloc(1, sizeof(*list));
+ if (list) {
+ DEBUG("Allocated PackageList at %p\n", list);
+ list->nrefs = 1;
+ }
+
+ return list;
+}
+
+PAKFIRE_EXPORT PakfirePackageList pakfire_packagelist_ref(PakfirePackageList list) {
+ list->nrefs++;
return list;
}
-PAKFIRE_EXPORT void pakfire_packagelist_free(PakfirePackageList list) {
- for (int i = 0; i < list->count; i++) {
- PakfirePackage pkg = list->elements[i];
- pakfire_package_unref(pkg);
+static void pakfire_packagelist_free(PakfirePackageList list) {
+ for (unsigned int i = 0; i < list->count; i++) {
+ pakfire_package_unref(list->elements[i]);
}
pakfire_free(list->elements);
pakfire_free(list);
+
+ DEBUG("Released PackageList at %p\n", list);
+}
+
+PAKFIRE_EXPORT PakfirePackageList pakfire_packagelist_unref(PakfirePackageList list) {
+ if (!list)
+ return NULL;
+
+ if (--list->nrefs > 0)
+ return list;
+
+ pakfire_packagelist_free(list);
+ return NULL;
}
-PAKFIRE_EXPORT int pakfire_packagelist_count(PakfirePackageList list) {
+PAKFIRE_EXPORT size_t pakfire_packagelist_count(PakfirePackageList list) {
return list->count;
}
qsort(list->elements, list->count, sizeof(*list->elements), _packagelist_cmp);
}
-PAKFIRE_EXPORT PakfirePackage pakfire_packagelist_get(PakfirePackageList list, int index) {
+PAKFIRE_EXPORT PakfirePackage pakfire_packagelist_get(PakfirePackageList list, unsigned int index) {
if (index < list->count)
return pakfire_package_ref(list->elements[index]);
}
PAKFIRE_EXPORT int pakfire_packagelist_has(PakfirePackageList list, PakfirePackage pkg) {
- for (int i = 0; i < list->count; i++) {
+ for (unsigned int i = 0; i < list->count; i++) {
PakfirePackage _pkg = list->elements[i];
if (pakfire_package_identical(pkg, _pkg))