}
static void Step_dealloc(StepObject* self) {
- if (self->step)
- pakfire_step_free(self->step);
+ pakfire_step_unref(self->step);
Py_XDECREF(self->transaction);
Py_TYPE(self)->tp_free((PyObject *)self);
#include <pakfire/types.h>
PakfireStep pakfire_step_create(PakfireTransaction transaction, Id id);
-void pakfire_step_free(PakfireStep step);
+PakfireStep pakfire_step_ref(PakfireStep step);
+PakfireStep pakfire_step_unref(PakfireStep step);
PakfirePackage pakfire_step_get_package(PakfireStep step);
pakfire_step_type_t pakfire_step_get_type(PakfireStep step);
PakfirePool pool;
PakfireTransaction transaction;
Id id;
+ int nrefs;
};
static inline PakfirePool pakfire_step_pool(PakfireStep step) {
# step
pakfire_step_create;
- pakfire_step_free;
pakfire_step_get_downloadsize;
pakfire_step_get_installsizechange;
pakfire_step_get_package;
pakfire_step_get_type;
pakfire_step_get_type_string;
pakfire_step_needs_download;
+ pakfire_step_ref;
+ pakfire_step_unref;
# transaction
pakfire_transaction_count;
#include <pakfire/cache.h>
#include <pakfire/constants.h>
+#include <pakfire/logging.h>
#include <pakfire/package.h>
#include <pakfire/pool.h>
#include <pakfire/private.h>
PAKFIRE_EXPORT PakfireStep pakfire_step_create(PakfireTransaction transaction, Id id) {
PakfireStep step = pakfire_calloc(1, sizeof(*step));
+ if (step) {
+ DEBUG("Allocated Step at %p\n", step);
+ step->nrefs = 1;
- step->pool = pakfire_transaction_get_pool(transaction);
- step->transaction = pakfire_transaction_ref(transaction);
- step->id = id;
+ step->pool = pakfire_transaction_get_pool(transaction);
+ step->transaction = pakfire_transaction_ref(transaction);
+ step->id = id;
+ }
+
+ return step;
+}
+
+PAKFIRE_EXPORT PakfireStep pakfire_step_ref(PakfireStep step) {
+ step->nrefs++;
return step;
}
-PAKFIRE_EXPORT void pakfire_step_free(PakfireStep step) {
+static void pakfire_step_free(PakfireStep step) {
pakfire_transaction_unref(step->transaction);
pakfire_pool_unref(step->pool);
pakfire_free(step);
+
+ DEBUG("Released Step at %p\n", step);
+}
+
+PAKFIRE_EXPORT PakfireStep pakfire_step_unref(PakfireStep step) {
+ if (!step)
+ return NULL;
+
+ if (--step->nrefs > 0)
+ return step;
+
+ pakfire_step_free(step);
+ return NULL;
}
PAKFIRE_EXPORT PakfirePackage pakfire_step_get_package(PakfireStep step) {
PakfireStep step = pakfire_transaction_get_step(transaction, i);
size += pakfire_step_get_downloadsize(step);
- pakfire_step_free(step);
+ pakfire_step_unref(step);
}
return size;
pakfire_package_unref(package);
}
- pakfire_step_free(step);
+ pakfire_step_unref(step);
}
// Sort list in place
r = pakfire_step_run(step, action);
// Free memory
- pakfire_step_free(step);
+ pakfire_step_unref(step);
// End loop if action was unsuccessful
if (r)