#include <sched.h>
#include <sys/personality.h>
+#include <solv/solver.h>
+
#include "archive.h"
#include "capabilities.h"
#include "constants.h"
static void Request_dealloc(RequestObject* self) {
if (self->request)
- pakfire_request_free(self->request);
+ pakfire_request_unref(self->request);
Py_XDECREF(self->pool);
Py_TYPE(self)->tp_free((PyObject *)self);
#include <pakfire/package.h>
#include <pakfire/packagelist.h>
+#include <pakfire/pool.h>
#include <pakfire/transaction.h>
#include "package.h"
// If request has got no transaction, we will create an (empty) new one.
if (!self->transaction) {
- PakfirePool pool = pakfire_request_pool(req);
+ PakfirePool pool = pakfire_request_get_pool(req);
self->transaction = pakfire_transaction_create(pool, NULL);
+ pakfire_pool_unref(pool);
}
return 0;
#define PAKFIRE_REQUEST_H
#include <solv/queue.h>
-#include <solv/solver.h>
#include <solv/transaction.h>
#include <pakfire/types.h>
};
PakfireRequest pakfire_request_create(PakfirePool pool);
+
PakfireRequest pakfire_request_ref(PakfireRequest request);
-void pakfire_request_free(PakfireRequest request);
+PakfireRequest pakfire_request_unref(PakfireRequest request);
-PakfirePool pakfire_request_pool(PakfireRequest request);
+PakfirePool pakfire_request_get_pool(PakfireRequest request);
int pakfire_request_solve(PakfireRequest request, int flags);
PakfireProblem pakfire_request_get_problems(PakfireRequest request);
#ifdef PAKFIRE_PRIVATE
-struct _PakfireRequest {
- PakfirePool pool;
- Queue queue;
- Solver* solver;
- Transaction* transaction;
- int nrefs;
-};
+#include <solv/solver.h>
+
+Solver* pakfire_request_get_solver(PakfireRequest request);
#endif
# request
pakfire_request_create;
pakfire_request_distupgrade;
- pakfire_request_free;
pakfire_request_erase;
pakfire_request_erase_relation;
pakfire_request_erase_selector;
+ pakfire_request_get_pool;
pakfire_request_get_problems;
pakfire_request_get_transaction;
pakfire_request_install;
pakfire_request_lock;
pakfire_request_lock_relation;
pakfire_request_lock_selector;
- pakfire_request_pool;
+ pakfire_request_ref;
pakfire_request_solve;
pakfire_request_upgrade;
pakfire_request_upgrade_all;
pakfire_request_upgrade_relation;
pakfire_request_upgrade_selector;
+ pakfire_request_unref;
pakfire_request_verify;
# selector
#include <pakfire/util.h>
static char* to_string(PakfireProblem problem) {
- Solver* solver = problem->request->solver;
+ Solver* solver = pakfire_request_get_solver(problem->request);
Pool* pool = solver->pool;
// Get the problem rule
if (problem->next)
pakfire_problem_free(problem->next);
- pakfire_request_free(problem->request);
+ pakfire_request_unref(problem->request);
if (problem->string)
pakfire_free(problem->string);
PAKFIRE_EXPORT PakfireSolution pakfire_problem_get_solutions(PakfireProblem problem) {
PakfireSolution ret = NULL;
+ Solver* solver = pakfire_request_get_solver(problem->request);
Id solution = 0;
- while ((solution = solver_next_solution(problem->request->solver, problem->id, solution)) != 0) {
+ while ((solution = solver_next_solution(solver, problem->id, solution)) != 0) {
PakfireSolution s = pakfire_solution_create(problem, solution);
if (ret)
#include <pakfire/types.h>
#include <pakfire/util.h>
+struct _PakfireRequest {
+ PakfirePool pool;
+ Queue queue;
+ Solver* solver;
+ Transaction* transaction;
+ int nrefs;
+};
+
PAKFIRE_EXPORT PakfireRequest pakfire_request_create(PakfirePool pool) {
PakfireRequest request = pakfire_calloc(1, sizeof(*request));
- request->pool = pool;
+ if (request) {
+ DEBUG("Allocated Request at %p\n", request);
+ request->nrefs = 1;
- queue_init(&request->queue);
-
- // Initialise reference counter
- request->nrefs = 1;
+ request->pool = pakfire_pool_ref(pool);
+ queue_init(&request->queue);
+ }
return request;
}
return request;
}
-PAKFIRE_EXPORT void pakfire_request_free(PakfireRequest request) {
- if (--request->nrefs > 0)
- return;
+static void pakfire_request_free(PakfireRequest request) {
+ pakfire_pool_unref(request->pool);
if (request->transaction)
transaction_free(request->transaction);
solver_free(request->solver);
queue_free(&request->queue);
-
pakfire_free(request);
+
+ DEBUG("Released Request at %p\n", request);
+}
+
+PAKFIRE_EXPORT PakfireRequest pakfire_request_unref(PakfireRequest request) {
+ if (!request)
+ return NULL;
+
+ if (--request->nrefs > 0)
+ return request;
+
+ pakfire_request_free(request);
+ return NULL;
+}
+
+PAKFIRE_EXPORT PakfirePool pakfire_request_get_pool(PakfireRequest request) {
+ return pakfire_pool_ref(request->pool);
}
-PAKFIRE_EXPORT PakfirePool pakfire_request_pool(PakfireRequest request) {
- return request->pool;
+Solver* pakfire_request_get_solver(PakfireRequest request) {
+ return request->solver;
}
static void init_solver(PakfireRequest request, int flags) {
- PakfirePool pool = pakfire_request_pool(request);
- Pool* p = pakfire_pool_get_solv_pool(pool);
+ Pool* p = pakfire_pool_get_solv_pool(request->pool);
Solver* solver = solver_create(p);
#include <pakfire/i18n.h>
#include <pakfire/private.h>
#include <pakfire/problem.h>
+#include <pakfire/request.h>
#include <pakfire/solution.h>
#include <pakfire/util.h>
static void import_elements(PakfireSolution solution) {
- Solver* solver = solution->problem->request->solver;
+ Solver* solver = pakfire_request_get_solver(solution->problem->request);
Pool* pool = solver->pool;
// Reserve memory