static void Package_dealloc(PackageObject* self) {
if (self->package)
- pakfire_package_free(self->package);
+ pakfire_package_unref(self->package);
Py_TYPE(self)->tp_free((PyObject *)self);
}
PyObject* repr = PyUnicode_FromFormat("<_pakfire.Step object type %s, %s>",
pakfire_step_get_type_string(self->step), nevra);
- pakfire_package_free(package);
+ pakfire_package_unref(package);
pakfire_free(nevra);
return repr;
PakfirePackage package = pakfire_step_get_package(self->step);
PyObject* obj = new_package(self->transaction->request->pool, pakfire_package_id(package));
- pakfire_package_free(package);
+ pakfire_package_unref(package);
return obj;
}
PakfirePackage pakfire_package_create(PakfirePool pool, Id id);
PakfirePackage pakfire_package_create2(PakfirePool pool, PakfireRepo repo, const char* name, const char* evr, const char* arch);
-void pakfire_package_free(PakfirePackage pkg);
+
+PakfirePackage pakfire_package_ref(PakfirePackage pkg);
+PakfirePackage pakfire_package_unref(PakfirePackage pkg);
int pakfire_package_identical(PakfirePackage pkg1, PakfirePackage pkg2);
int pakfire_package_cmp(PakfirePackage pkg1, PakfirePackage pkg2);
pakfire_package_dump;
pakfire_package_filelist_append;
pakfire_package_filelist_remove;
- pakfire_package_free;
pakfire_package_get_arch;
pakfire_package_get_buildhost;
pakfire_package_get_buildtime;
pakfire_package_get_version;
pakfire_package_id;
pakfire_package_is_installed;
+ pakfire_package_ref;
pakfire_package_set_arch;
pakfire_package_set_buildhost;
pakfire_package_set_buildtime;
pakfire_package_set_url;
pakfire_package_set_uuid;
pakfire_package_set_vendor;
+ pakfire_package_unref;
# packagelist
pakfire_packagelist_count;
return pkg;
}
-PAKFIRE_EXPORT void pakfire_package_free(PakfirePackage pkg) {
- if (--pkg->nrefs > 0)
- return;
-
+static void pakfire_package_free(PakfirePackage pkg) {
pakfire_pool_unref(pkg->pool);
pakfire_package_filelist_remove(pkg);
pakfire_free(pkg);
}
+PAKFIRE_EXPORT PakfirePackage pakfire_package_ref(PakfirePackage pkg) {
+ pkg->nrefs++;
+
+ return pkg;
+}
+
+PAKFIRE_EXPORT PakfirePackage pakfire_package_unref(PakfirePackage pkg) {
+ if (!pkg)
+ return NULL;
+
+ if (--pkg->nrefs > 0)
+ return pkg;
+
+ pakfire_package_free(pkg);
+ return NULL;
+}
+
static Solvable* get_solvable(PakfirePackage pkg) {
Pool* pool = pakfire_package_get_solv_pool(pkg);
PAKFIRE_EXPORT void pakfire_packagelist_free(PakfirePackageList list) {
for (int i = 0; i < list->count; i++) {
PakfirePackage pkg = list->elements[i];
- pakfire_package_free(pkg);
+ pakfire_package_unref(pkg);
}
pakfire_free(list->elements);
if (pakfire_packagelist_has(list, pkg))
return;
- pakfire_packagelist_push(list, pkg);
+ pakfire_packagelist_push(list, pakfire_package_ref(pkg));
}
PAKFIRE_EXPORT PakfirePackageList pakfire_packagelist_from_queue(PakfirePool _pool, Queue* q) {
downloadsize = pakfire_package_get_downloadsize(pkg);
}
- if (pkg)
- pakfire_package_free(pkg);
+ pakfire_package_unref(pkg);
return downloadsize;
}
break;
}
- pakfire_package_free(pkg);
+ pakfire_package_unref(pkg);
return installsize;
}
ret = !pakfire_cache_has_package(cache, pkg);
finish:
- if (pkg)
- pakfire_package_free(pkg);
+ pakfire_package_unref(pkg);
return ret;
}
}
END:
- pakfire_package_free(pkg);
+ pakfire_package_unref(pkg);
return r;
}
PakfirePackage package = pakfire_step_get_package(step);
pakfire_packagelist_push(packagelist, package);
- pakfire_package_free(package);
+ pakfire_package_unref(package);
}
pakfire_step_free(step);