for (int i = 0; i < count; i++) {
PakfireRelation relation = pakfire_relationlist_get_clone(relationlist, i);
- PyObject* relation_obj = new_relation(pakfire, pakfire_relation_id(relation));
+ PyObject* relation_obj = new_relation(pakfire, pakfire_relation_get_id(relation));
- pakfire_relation_free(relation);
+ pakfire_relation_unref(relation);
if (relation_obj == NULL)
goto fail;
PyObject* item = PySequence_GetItem(value, i);
if (!PyObject_TypeCheck(item, &RelationType)) {
- pakfire_relationlist_free(relationlist);
+ pakfire_relationlist_unref(relationlist);
Py_DECREF(item);
PyErr_SetString(PyExc_AttributeError, "Expected a Relation object");
PakfireRelationList relationlist = pakfire_package_get_provides(self->package);
PyObject* list = PyList_FromRelationList(self->pakfire, relationlist);
- pakfire_relationlist_free(relationlist);
+ pakfire_relationlist_unref(relationlist);
return list;
}
return -1;
pakfire_package_set_provides(self->package, relationlist);
- pakfire_relationlist_free(relationlist);
+ pakfire_relationlist_unref(relationlist);
return 0;
}
PakfireRelationList relationlist = pakfire_package_get_requires(self->package);
PyObject* list = PyList_FromRelationList(self->pakfire, relationlist);
- pakfire_relationlist_free(relationlist);
+ pakfire_relationlist_unref(relationlist);
return list;
}
return -1;
pakfire_package_set_requires(self->package, relationlist);
- pakfire_relationlist_free(relationlist);
+ pakfire_relationlist_unref(relationlist);
return 0;
}
PakfireRelationList relationlist = pakfire_package_get_obsoletes(self->package);
PyObject* list = PyList_FromRelationList(self->pakfire, relationlist);
- pakfire_relationlist_free(relationlist);
+ pakfire_relationlist_unref(relationlist);
return list;
}
return -1;
pakfire_package_set_obsoletes(self->package, relationlist);
- pakfire_relationlist_free(relationlist);
+ pakfire_relationlist_unref(relationlist);
return 0;
}
PakfireRelationList relationlist = pakfire_package_get_conflicts(self->package);
PyObject* list = PyList_FromRelationList(self->pakfire, relationlist);
- pakfire_relationlist_free(relationlist);
+ pakfire_relationlist_unref(relationlist);
return list;
}
return -1;
pakfire_package_set_conflicts(self->package, relationlist);
- pakfire_relationlist_free(relationlist);
+ pakfire_relationlist_unref(relationlist);
return 0;
}
PakfireRelationList relationlist = pakfire_package_get_recommends(self->package);
PyObject* list = PyList_FromRelationList(self->pakfire, relationlist);
- pakfire_relationlist_free(relationlist);
+ pakfire_relationlist_unref(relationlist);
return list;
}
return -1;
pakfire_package_set_recommends(self->package, relationlist);
- pakfire_relationlist_free(relationlist);
+ pakfire_relationlist_unref(relationlist);
return 0;
}
PakfireRelationList relationlist = pakfire_package_get_suggests(self->package);
PyObject* list = PyList_FromRelationList(self->pakfire, relationlist);
- pakfire_relationlist_free(relationlist);
+ pakfire_relationlist_unref(relationlist);
return list;
}
return -1;
pakfire_package_set_suggests(self->package, relationlist);
- pakfire_relationlist_free(relationlist);
+ pakfire_relationlist_unref(relationlist);
return 0;
}
#include "package.h"
#include "relation.h"
-static RelationObject* Relation_new_core(PyTypeObject* type, PoolObject* pool) {
+static RelationObject* Relation_new_core(PyTypeObject* type, PakfireObject* pakfire) {
RelationObject* self = (RelationObject *)type->tp_alloc(type, 0);
if (!self)
return NULL;
- if (pool) {
- self->pool = pool;
- Py_INCREF(self->pool);
- }
+ self->pakfire = pakfire;
+ Py_INCREF(self->pakfire);
self->relation = NULL;
}
static void Relation_dealloc(RelationObject* self) {
- if (self->relation)
- pakfire_relation_free(self->relation);
+ pakfire_relation_unref(self->relation);
Py_XDECREF(self->pool);
Py_TYPE(self)->tp_free((PyObject *)self);
}
static int Relation_init(RelationObject* self, PyObject* args, PyObject* kwds) {
- PyObject* pool;
+ PakfireObject* pakfire;
const char* name;
const char* evr = NULL;
int cmp_type = 0;
- if (!PyArg_ParseTuple(args, "O!s|is", &PoolType, &pool, &name, &cmp_type, &evr))
+ if (!PyArg_ParseTuple(args, "O!s|is", &PakfireType, &pakfire, &name, &cmp_type, &evr))
return -1;
- self->pool = (PoolObject *)pool;
- Py_INCREF(self->pool);
+ self->pakfire = pakfire;
+ Py_INCREF(self->pakfire);
- self->relation = pakfire_relation_create(self->pool->pool, name, cmp_type, evr);
+ self->relation = pakfire_relation_create(self->pakfire->pakfire, name, cmp_type, evr);
if (!self->relation) {
+ Py_DECREF(self->pakfire);
+
PyErr_Format(PyExc_ValueError, "No such relation: %s", name);
return -1;
}
}
static long Relation_hash(RelationObject* self) {
- return pakfire_relation_id(self->relation);
+ return pakfire_relation_get_id(self->relation);
}
static PyObject* Relation_repr(RelationObject* self) {
#include <pakfire/types.h>
#include "package.h"
+#include "pakfire.h"
#include "selector.h"
static PyObject* Selector_new(PyTypeObject* type, PyObject* args, PyObject* kwds) {
SelectorObject* self = (SelectorObject *)type->tp_alloc(type, 0);
if (self) {
- self->pool = NULL;
self->selector = NULL;
}
static void Selector_dealloc(SelectorObject* self) {
pakfire_selector_unref(self->selector);
- Py_XDECREF(self->pool);
Py_TYPE(self)->tp_free((PyObject *)self);
}
static int Selector_init(SelectorObject* self, PyObject* args, PyObject* kwds) {
- PyObject* pool;
+ PakfireObject* pakfire;
- if (!PyArg_ParseTuple(args, "O!", &PoolType, &pool))
+ if (!PyArg_ParseTuple(args, "O!", &PakfireType, &pakfire))
return -1;
- self->pool = (PoolObject *)pool;
- Py_INCREF(self->pool);
-
- self->selector = pakfire_selector_create(self->pool->pool);
+ self->selector = pakfire_selector_create(pakfire->pakfire);
return 0;
}
for (unsigned int i = 0; i < pakfire_packagelist_count(packagelist); i++) {
PakfirePackage package = pakfire_packagelist_get(packagelist, i);
- PyObject* obj = new_package(self->pool, pakfire_package_id(package));
+ PyObject* obj = new_package(NULL, pakfire_package_id(package));
PyList_Append(list, obj);
pakfire_package_unref(package);
#include <Python.h>
-#include <pakfire/selector.h>
-
-#include "pool.h"
+#include <pakfire/types.h>
typedef struct {
PyObject_HEAD
- PoolObject* pool;
PakfireSelector selector;
} SelectorObject;
#include <pakfire/pool.h>
#include <pakfire/types.h>
-PakfireRelation pakfire_relation_create(PakfirePool pool, const char* name, int cmp_type, const char* evr);
-PakfireRelation pakfire_relation_create_from_id(PakfirePool pool, Id id);
-void pakfire_relation_free(PakfireRelation relation);
+PakfireRelation pakfire_relation_create(Pakfire pakfire, const char* name, int cmp_type, const char* evr);
+PakfireRelation pakfire_relation_create_from_id(Pakfire pakfire, Id id);
-Id pakfire_relation_id(PakfireRelation relation);
+PakfireRelation pakfire_relation_ref(PakfireRelation relation);
+PakfireRelation pakfire_relation_unref(PakfireRelation relation);
+
+Id pakfire_relation_get_id(PakfireRelation relation);
char* pakfire_relation_str(PakfireRelation relation);
PakfirePackageList pakfire_relation_providers(PakfireRelation relation);
int pakfire_relation2queue(const PakfireRelation relation, Queue* queue, int solver_action);
-#ifdef PAKFIRE_PRIVATE
-
-struct _PakfireRelation {
- Pakfire pakfire;
- PakfirePool pool;
- Id id;
-};
-
-static inline Pool* pakfire_relation_solv_pool(PakfireRelation relation) {
- return pakfire_pool_get_solv_pool(relation->pool);
-}
-
-#endif
-
#endif /* PAKFIRE_RELATION_H */
#ifndef PAKFIRE_RELATIONLIST_H
#define PAKFIRE_RELATIONLIST_H
-#include <solv/queue.h>
-
-#include <pakfire/pool.h>
-#include <pakfire/relation.h>
#include <pakfire/types.h>
-PakfireRelationList pakfire_relationlist_create(PakfirePool pool);
-void pakfire_relationlist_free(PakfireRelationList reldeplist);
+PakfireRelationList pakfire_relationlist_create(Pakfire pakfire);
+
+PakfireRelationList pakfire_relationlist_ref(PakfireRelationList relationlist);
+PakfireRelationList pakfire_relationlist_unref(PakfireRelationList relationlist);
void pakfire_relationlist_add(PakfireRelationList relationlist, PakfireRelation relation);
int pakfire_relationlist_count(PakfireRelationList relationlist);
#ifdef PAKFIRE_PRIVATE
-struct _PakfireRelationList {
- PakfirePool pool;
- Queue queue;
-};
-
-PakfireRelationList pakfire_relationlist_from_queue(PakfirePool pool, Queue q);
+PakfireRelationList pakfire_relationlist_from_queue(Pakfire pakfire, Queue q);
void pakfire_relationlist_clone_to_queue(PakfireRelationList relationlist, Queue* q);
#endif
# relation
pakfire_relation_create;
pakfire_relation_create_from_id;
- pakfire_relation_free;
- pakfire_relation_id;
+ pakfire_relation_get_id;
pakfire_relation_providers;
+ pakfire_relation_ref;
pakfire_relation_str;
+ pakfire_relation_unref;
# relationlist
pakfire_relationlist_add;
pakfire_relationlist_count;
pakfire_relationlist_create;
- pakfire_relationlist_free;
pakfire_relationlist_get_clone;
+ pakfire_relationlist_ref;
+ pakfire_relationlist_unref;
# request
pakfire_request_create;
}
static void pakfire_package_add_self_provides(Pakfire pakfire, PakfirePackage pkg, const char* name, const char* evr) {
- PakfirePool pool = pakfire_get_pool(pakfire);
+ PakfireRelation relation = pakfire_relation_create(pakfire, name, PAKFIRE_EQ, evr);
- PakfireRelation relation = pakfire_relation_create(pool, name, PAKFIRE_EQ, evr);
pakfire_package_add_provides(pkg, relation);
- pakfire_relation_free(relation);
- pakfire_pool_unref(pool);
+ pakfire_relation_unref(relation);
}
PAKFIRE_EXPORT PakfirePackage pakfire_package_create(Pakfire pakfire, Id id) {
Solvable* s = get_solvable(pkg);
solvable_lookup_idarray(s, type, &q);
- PakfirePool pool = pakfire_get_pool(pkg->pakfire);
- PakfireRelationList relationlist = pakfire_relationlist_from_queue(pool, q);
- pakfire_pool_unref(pool);
-
+ PakfireRelationList relationlist = pakfire_relationlist_from_queue(pkg->pakfire, q);
queue_free(&q);
return relationlist;
int count = pakfire_relationlist_count(relationlist);
for (int i = 0; i < count; i++) {
PakfireRelation relation = pakfire_relationlist_get_clone(relationlist, i);
- solvable_add_idarray(s, type, relation->id);
+ solvable_add_idarray(s, type, pakfire_relation_get_id(relation));
- pakfire_relation_free(relation);
+ pakfire_relation_unref(relation);
}
}
static void pakfire_package_add_relation(PakfirePackage pkg, Id type, PakfireRelation relation) {
Solvable* s = get_solvable(pkg);
- solvable_add_idarray(s, type, relation->id);
+ solvable_add_idarray(s, type, pakfire_relation_get_id(relation));
}
PAKFIRE_EXPORT PakfireRelationList pakfire_package_get_provides(PakfirePackage pkg) {
if (relation) {
char* dep = pakfire_relation_str(relation);
- pakfire_relation_free(relation);
+ pakfire_relation_unref(relation);
// Stop here and don't list any files.
if (strcmp(PAKFIRE_SOLVABLE_FILEMARKER, dep) == 0)
PakfireRelationList provides = pakfire_package_get_provides(pkg);
if (provides) {
pakfire_package_dump_add_line_relations(&string, _("Provides"), provides);
- pakfire_relationlist_free(provides);
+ pakfire_relationlist_unref(provides);
}
PakfireRelationList requires = pakfire_package_get_requires(pkg);
if (requires) {
pakfire_package_dump_add_line_relations(&string, _("Requires"), requires);
- pakfire_relationlist_free(requires);
+ pakfire_relationlist_unref(requires);
}
PakfireRelationList conflicts = pakfire_package_get_conflicts(pkg);
if (conflicts) {
pakfire_package_dump_add_line_relations(&string, _("Conflicts"), conflicts);
- pakfire_relationlist_free(conflicts);
+ pakfire_relationlist_unref(conflicts);
}
PakfireRelationList obsoletes = pakfire_package_get_obsoletes(pkg);
if (obsoletes) {
pakfire_package_dump_add_line_relations(&string, _("Obsoletes"), obsoletes);
- pakfire_relationlist_free(obsoletes);
+ pakfire_relationlist_unref(obsoletes);
}
PakfireRelationList recommends = pakfire_package_get_recommends(pkg);
if (recommends) {
pakfire_package_dump_add_line_relations(&string, _("Recommends"), recommends);
- pakfire_relationlist_free(recommends);
+ pakfire_relationlist_unref(recommends);
}
PakfireRelationList suggests = pakfire_package_get_suggests(pkg);
if (suggests) {
pakfire_package_dump_add_line_relations(&string, _("Suggests"), suggests);
- pakfire_relationlist_free(suggests);
+ pakfire_relationlist_unref(suggests);
}
}
#include <solv/queue.h>
#include <solv/solver.h>
+#include <pakfire/logging.h>
#include <pakfire/packagelist.h>
+#include <pakfire/pakfire.h>
#include <pakfire/pool.h>
#include <pakfire/private.h>
#include <pakfire/relation.h>
#include <pakfire/types.h>
#include <pakfire/util.h>
+struct _PakfireRelation {
+ Pakfire pakfire;
+ Id id;
+ int nrefs;
+};
+
static int cmptype2relflags(int type) {
int flags = 0;
return flags;
}
-PAKFIRE_EXPORT PakfireRelation pakfire_relation_create(PakfirePool pool, const char* name, int cmp_type, const char* evr) {
- Pool* p = pakfire_pool_get_solv_pool(pool);
+PAKFIRE_EXPORT PakfireRelation pakfire_relation_create(Pakfire pakfire, const char* name, int cmp_type, const char* evr) {
+ Pool* p = pakfire_get_solv_pool(pakfire);
Id id = pool_str2id(p, name, 1);
id = pool_rel2id(p, id, ievr, flags, 1);
}
- return pakfire_relation_create_from_id(pool, id);
+ return pakfire_relation_create_from_id(pakfire, id);
}
-PAKFIRE_EXPORT PakfireRelation pakfire_relation_create_from_id(PakfirePool pool, Id id) {
+PAKFIRE_EXPORT PakfireRelation pakfire_relation_create_from_id(Pakfire pakfire, Id id) {
PakfireRelation relation = pakfire_calloc(1, sizeof(*relation));
+ if (relation) {
+ DEBUG("Allocated Relation at %p\n", relation);
+ relation->nrefs = 1;
+
+ relation->pakfire = pakfire_ref(pakfire);
+ relation->id = id;
+ }
+
+ return relation;
+}
- relation->pool = pool;
- relation->id = id;
+PAKFIRE_EXPORT PakfireRelation pakfire_relation_ref(PakfireRelation relation) {
+ relation->nrefs++;
return relation;
}
-PAKFIRE_EXPORT void pakfire_relation_free(PakfireRelation relation) {
+static void pakfire_relation_free(PakfireRelation relation) {
+ pakfire_unref(relation->pakfire);
pakfire_free(relation);
+
+ DEBUG("Released Relation at %p\n", relation);
+}
+
+PAKFIRE_EXPORT PakfireRelation pakfire_relation_unref(PakfireRelation relation) {
+ if (!relation)
+ return NULL;
+
+ if (--relation->nrefs > 0)
+ return relation;
+
+ pakfire_relation_free(relation);
+ return NULL;
}
-PAKFIRE_EXPORT Id pakfire_relation_id(PakfireRelation relation) {
+PAKFIRE_EXPORT Id pakfire_relation_get_id(PakfireRelation relation) {
return relation->id;
}
PAKFIRE_EXPORT char* pakfire_relation_str(PakfireRelation relation) {
- Pool* pool = pakfire_relation_solv_pool(relation);
+ Pool* pool = pakfire_get_solv_pool(relation->pakfire);
const char* str = pool_dep2str(pool, relation->id);
#include <solv/pooltypes.h>
#include <solv/queue.h>
+#include <pakfire/logging.h>
+#include <pakfire/pakfire.h>
#include <pakfire/pool.h>
#include <pakfire/private.h>
#include <pakfire/relation.h>
#include <pakfire/types.h>
#include <pakfire/util.h>
-PAKFIRE_EXPORT PakfireRelationList pakfire_relationlist_create(PakfirePool pool) {
+struct _PakfireRelationList {
+ Pakfire pakfire;
+ Queue queue;
+ int nrefs;
+};
+
+PAKFIRE_EXPORT PakfireRelationList pakfire_relationlist_create(Pakfire pakfire) {
PakfireRelationList relationlist = pakfire_calloc(1, sizeof(*relationlist));
if (relationlist) {
- relationlist->pool = pool;
+ DEBUG("Allocated RelationList at %p\n", relationlist);
+ relationlist->nrefs = 1;
+
+ relationlist->pakfire = pakfire_ref(pakfire);
queue_init(&relationlist->queue);
}
return relationlist;
}
-PAKFIRE_EXPORT void pakfire_relationlist_free(PakfireRelationList relationlist) {
+PAKFIRE_EXPORT PakfireRelationList pakfire_relationlist_ref(PakfireRelationList relationlist) {
+ relationlist->nrefs++;
+
+ return relationlist;
+}
+
+static void pakfire_relationlist_free(PakfireRelationList relationlist) {
queue_free(&relationlist->queue);
+
+ pakfire_unref(relationlist->pakfire);
pakfire_free(relationlist);
+
+ DEBUG("Released RelationList at %p\n", relationlist);
+}
+
+PAKFIRE_EXPORT PakfireRelationList pakfire_relationlist_unref(PakfireRelationList relationlist) {
+ if (!relationlist)
+ return NULL;
+
+ if (--relationlist->nrefs > 0)
+ return relationlist;
+
+ pakfire_relationlist_free(relationlist);
+ return NULL;
}
PAKFIRE_EXPORT void pakfire_relationlist_add(PakfireRelationList relationlist, PakfireRelation relation) {
- queue_push(&relationlist->queue, relation->id);
+ queue_push(&relationlist->queue, pakfire_relation_get_id(relation));
}
PAKFIRE_EXPORT int pakfire_relationlist_count(PakfireRelationList relationlist) {
return relationlist->queue.count;
}
-PAKFIRE_EXPORT PakfireRelationList pakfire_relationlist_from_queue(PakfirePool pool, Queue q) {
- PakfireRelationList relationlist = pakfire_calloc(1, sizeof(*relationlist));
+PAKFIRE_EXPORT PakfireRelationList pakfire_relationlist_from_queue(Pakfire pakfire, Queue q) {
+ PakfireRelationList relationlist = pakfire_relationlist_create(pakfire);
if (relationlist) {
- relationlist->pool = pool;
+ // Release old queue
+ queue_free(&relationlist->queue);
+
+ // Copy the queue
queue_init_clone(&relationlist->queue, &q);
}
PAKFIRE_EXPORT PakfireRelation pakfire_relationlist_get_clone(PakfireRelationList relationlist, int index) {
Id id = relationlist->queue.elements[index];
- return pakfire_relation_create_from_id(relationlist->pool, id);
+ return pakfire_relation_create_from_id(relationlist->pakfire, id);
}
PAKFIRE_EXPORT void pakfire_relationlist_clone_to_queue(PakfireRelationList relationlist, Queue* q) {