]> git.ipfire.org Git - pakfire.git/commitdiff
libpakfire: Always add a pool to Pakfire
authorMichael Tremer <michael.tremer@ipfire.org>
Thu, 23 Nov 2017 17:56:14 +0000 (18:56 +0100)
committerMichael Tremer <michael.tremer@ipfire.org>
Thu, 23 Nov 2017 17:56:14 +0000 (18:56 +0100)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/_pakfire/pool.c
src/libpakfire/include/pakfire/pakfire.h
src/libpakfire/include/pakfire/pool.h
src/libpakfire/libpakfire.sym
src/libpakfire/pakfire.c
src/libpakfire/pool.c
src/pakfire/base.py

index 3c0fc820698fbc6f63ad724b923b75025f21b469..5061f908b3892e36d79e46a5c4beb214149293af 100644 (file)
 #include <solv/solver.h>
 
 #include <pakfire/errno.h>
+#include <pakfire/pakfire.h>
 #include <pakfire/pool.h>
 #include <pakfire/repo.h>
 
 #include "constants.h"
+#include "pakfire.h"
 #include "pool.h"
 #include "relation.h"
 #include "repo.h"
@@ -45,25 +47,20 @@ static PyObject* Pool_new(PyTypeObject* type, PyObject* args, PyObject* kwds) {
 
 static void Pool_dealloc(PoolObject* self) {
        if (self->pool)
-               pakfire_pool_free(self->pool);
+               pakfire_pool_unref(self->pool);
 
        Py_TYPE(self)->tp_free((PyObject *)self);
 }
 
 static int Pool_init(PoolObject* self, PyObject* args, PyObject* kwds) {
-       const char* arch;
+       PakfireObject* pakfire = NULL;
 
-       if (!PyArg_ParseTuple(args, "s", &arch))
+       if (!PyArg_ParseTuple(args, "O!", &PakfireType, &pakfire))
                return -1;
 
-       self->pool = pakfire_pool_create(arch);
-       if (self->pool == NULL) {
-               switch(pakfire_get_errno()) {
-                       default:
-                               assert(0);
-               }
+       self->pool = pakfire_get_pool(pakfire->pakfire);
+       if (!self->pool)
                return -1;
-       }
 
        return 0;
 }
index ce81b3fb92e197fb91d7179f527b90fd77bc8055..0ba4b276dd6cba799d810b010e1c58806ea1426b 100644 (file)
@@ -31,11 +31,14 @@ void pakfire_unref(Pakfire pakfire);
 const char* pakfire_get_path(Pakfire pakfire);
 const char* pakfire_get_arch(Pakfire pakfire);
 
+PakfirePool pakfire_get_pool(Pakfire pakfire);
+
 #ifdef PAKFIRE_PRIVATE
 
 struct _Pakfire {
-    char* path;
-    char* arch;
+       char* path;
+       char* arch;
+       PakfirePool pool;
        int nrefs;
 };
 
index 0613879ca4d746f3ec26fa3fee2acdaa429c7de7..e99719822895d5498109bb7086f38bdc55f62991 100644 (file)
@@ -25,8 +25,9 @@
 
 #include <pakfire/types.h>
 
-PakfirePool pakfire_pool_create(const char* arch);
-void pakfire_pool_free(PakfirePool pool);
+PakfirePool pakfire_pool_create(Pakfire pakfire);
+PakfirePool pakfire_pool_ref(PakfirePool pool);
+void pakfire_pool_unref(PakfirePool pool);
 
 int pakfire_pool_version_compare(PakfirePool pool, const char* evr1, const char* evr2);
 int pakfire_pool_count(PakfirePool pool);
@@ -52,6 +53,7 @@ struct _PakfirePool {
        Queue installonly;
 
        PakfireCache cache;
+       int nrefs;
 };
 
 void pakfire_pool_make_provides_ready(PakfirePool pool);
index 42172ad67b1668814651b93efd9173eabd4d2c26..abd0487238e0e096d3e25a07bd49bec92080c51f 100644 (file)
@@ -24,6 +24,7 @@ global:
        pakfire_create;
        pakfire_get_arch;
        pakfire_get_path;
+       pakfire_get_pool;
        pakfire_ref;
        pakfire_unref;
 
@@ -165,14 +166,15 @@ global:
        # pool
        pakfire_pool_count;
        pakfire_pool_create;
-       pakfire_pool_free;
        pakfire_pool_get_cache_path;
        pakfire_pool_get_installed_repo;
        pakfire_pool_get_installonly;
+       pakfire_pool_ref;
        pakfire_pool_search;
        pakfire_pool_set_cache_path;
        pakfire_pool_set_installed_repo;
        pakfire_pool_set_installonly;
+       pakfire_pool_unref;
        pakfire_pool_version_compare;
        pakfire_pool_whatprovides;
 
index c2b2c10eca6f87f1050121aba754a074b25679b8..3c38df96775835350adc936ef94e8b3c4eb5ce04 100644 (file)
 #############################################################################*/
 
 #include <pakfire/pakfire.h>
+#include <pakfire/pool.h>
 #include <pakfire/types.h>
 #include <pakfire/util.h>
 
 Pakfire pakfire_create(const char* path, const char* arch) {
-    Pakfire pakfire = pakfire_calloc(1, sizeof(*pakfire));
-    if (pakfire) {
-        pakfire->path = pakfire_strdup(path);
-        pakfire->arch = pakfire_strdup(arch);
-    }
+       Pakfire pakfire = pakfire_calloc(1, sizeof(*pakfire));
+       if (pakfire) {
+               pakfire->nrefs = 1;
 
-    return pakfire;
+               pakfire->path = pakfire_strdup(path);
+               pakfire->arch = pakfire_strdup(arch);
+
+               // Initialize the pool
+               pakfire->pool = pakfire_pool_create(pakfire);
+       }
+
+       return pakfire;
 }
 
 Pakfire pakfire_ref(Pakfire pakfire) {
-    ++pakfire->nrefs;
+       ++pakfire->nrefs;
 
-    return pakfire;
+       return pakfire;
 }
 
 void pakfire_unref(Pakfire pakfire) {
-    if (--pakfire->nrefs > 0)
-        return;
+       if (--pakfire->nrefs > 0)
+               return;
+
+       pakfire_pool_unref(pakfire->pool);
 
-    pakfire_free(pakfire->path);
-    pakfire_free(pakfire->arch);
-    pakfire_free(pakfire);
+       pakfire_free(pakfire->path);
+       pakfire_free(pakfire->arch);
+       pakfire_free(pakfire);
 }
 
 const char* pakfire_get_path(Pakfire pakfire) {
-    return pakfire->path;
+       return pakfire->path;
 }
 
 const char* pakfire_get_arch(Pakfire pakfire) {
-    return pakfire->arch;
+       return pakfire->arch;
+}
+
+PakfirePool pakfire_get_pool(Pakfire pakfire) {
+       return pakfire_pool_ref(pakfire->pool);
 }
index 26e2460b48ae14e0556e64b8cfb2c8edaa7e2050..a81c25a3a633b97ccadae0eb1d1f30ca0fed82fa 100644 (file)
 #include <pakfire/cache.h>
 #include <pakfire/package.h>
 #include <pakfire/packagelist.h>
+#include <pakfire/pakfire.h>
 #include <pakfire/pool.h>
 #include <pakfire/repo.h>
 #include <pakfire/types.h>
 #include <pakfire/util.h>
 
-PakfirePool pakfire_pool_create(const char* arch) {
+PakfirePool pakfire_pool_create(Pakfire pakfire) {
        PakfirePool pool = pakfire_calloc(1, sizeof(*pool));
+       if (pool) {
+               pool->nrefs = 1;
+       }
        pool->pool = pool_create();
 
        queue_init(&pool->installonly);
 
        // Set architecture
+       const char* arch = pakfire_get_arch(pakfire);
        pool_setarch(pool->pool, arch);
 
        return pool;
@@ -59,7 +64,7 @@ static void pakfire_pool_free_repos(Pool* pool) {
        }
 }
 
-void pakfire_pool_free(PakfirePool pool) {
+static void pakfire_pool_free(PakfirePool pool) {
        pakfire_pool_free_repos(pool->pool);
 
        queue_free(&pool->installonly);
@@ -68,6 +73,19 @@ void pakfire_pool_free(PakfirePool pool) {
        pakfire_free(pool);
 }
 
+PakfirePool pakfire_pool_ref(PakfirePool pool) {
+       ++pool->nrefs;
+
+       return pool;
+}
+
+void pakfire_pool_unref(PakfirePool pool) {
+       if (--pool->nrefs > 0)
+               return;
+
+       pakfire_pool_free(pool);
+}
+
 int pakfire_pool_version_compare(PakfirePool pool, const char* evr1, const char* evr2) {
        return pool_evrcmp_str(pool->pool, evr1, evr2, EVRCMP_COMPARE);
 }
index 33024fa2a00c1dfc51c95f319600f68f04e36a60..21e5c8e38ae135d2e7454ef21a966af2de0e71b1 100644 (file)
@@ -64,7 +64,7 @@ class Pakfire(_pakfire.Pakfire):
                # Initialize the keyring
                #self.keyring = keyring.Keyring(self)
 
-               self.pool = _pakfire.Pool(self.arch)
+               self.pool = _pakfire.Pool(self)
                self.pool.cache_path = cache_path or \
                        os.path.join(CACHE_DIR, self.distro.sname, self.distro.release)