]> git.ipfire.org Git - pakfire.git/commitdiff
libpakfire: Make Repo opague and implement refcounting
authorMichael Tremer <michael.tremer@ipfire.org>
Mon, 15 Jan 2018 16:50:33 +0000 (17:50 +0100)
committerMichael Tremer <michael.tremer@ipfire.org>
Mon, 15 Jan 2018 16:50:33 +0000 (17:50 +0100)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/_pakfire/package.c
src/_pakfire/repo.c
src/_pakfire/repo.h
src/libpakfire/include/pakfire/repo.h
src/libpakfire/libpakfire.sym
src/libpakfire/package.c
src/libpakfire/pool.c
src/libpakfire/repo.c
src/libpakfire/transaction.c

index f6e68a37115dafbecc4fa0c3c854ff74a84c4b5e..42027ba95e7ea490b2f849199be5671a82703f71 100644 (file)
@@ -452,12 +452,11 @@ static PyObject* Package_get_cache_full_path(PackageObject* self) {
 
 static PyObject* Package_get_repo(PackageObject* self) {
        PakfireRepo repo = pakfire_package_get_repo(self->package);
-
        if (!repo)
                return NULL;
 
        const char* name = pakfire_repo_get_name(repo);
-       pakfire_repo_free(repo);
+       pakfire_repo_unref(repo);
 
        return new_repo(self->pool, name);
 }
index 038e79d8ef33045e27adf8b3cecdcd933cdce16f..25d5d19a9ae331dc627865cf1f569729fcaf8013 100644 (file)
@@ -49,8 +49,7 @@ static PyObject* Repo_new(PyTypeObject* type, PyObject* args, PyObject* kwds) {
 }
 
 static void Repo_dealloc(RepoObject* self) {
-       if (self->repo)
-               pakfire_repo_free(self->repo);
+       pakfire_repo_unref(self->repo);
 
        Py_XDECREF(self->pool);
        Py_TYPE(self)->tp_free((PyObject *)self);
index 4fe2e2108c7976d379ea75abc8f6188d3f90420a..5780a7c73e1292307716b3264b6bae04376887d5 100644 (file)
@@ -34,7 +34,7 @@ typedef struct {
     PakfireRepo repo;
 
        // XXX COMPAT
-       Repo* _repo;
+       void* _repo;
 } RepoObject;
 
 extern PyTypeObject RepoType;
index 20b8f8e63d3c94d2f700320964375915228a1526..9c00d860ae2c342913e6f610e3723f9f79ab16c3 100644 (file)
 #ifndef PAKFIRE_REPO_H
 #define PAKFIRE_REPO_H
 
-#include <solv/repo.h>
-
 #include <pakfire/types.h>
 
 PakfireRepo pakfire_repo_create(PakfirePool pool, const char* name);
-PakfireRepo pakfire_repo_create_from_repo(PakfirePool pool, Repo* r);
-void pakfire_repo_free(PakfireRepo pkg);
+
+PakfireRepo pakfire_repo_ref(PakfireRepo repo);
+PakfireRepo pakfire_repo_unref(PakfireRepo repo);
 
 PakfirePool pakfire_repo_pool(PakfireRepo repo);
 
@@ -60,24 +59,14 @@ int pakfire_repo_clean(PakfireRepo repo);
 
 #ifdef PAKFIRE_PRIVATE
 
-struct _PakfireRepo {
-       PakfirePool pool;
-       Repo* repo;
-       PakfireRepoCache cache;
-       int nrefs;
+#include <solv/repo.h>
 
-       Repodata* filelist;
-};
+PakfireRepo pakfire_repo_create_from_repo(PakfirePool pool, Repo* r);
 
 PakfirePackage pakfire_repo_add_package(PakfireRepo repo);
 
-static inline Pool* pakfire_repo_solv_pool(PakfireRepo repo) {
-       return pakfire_pool_get_solv_pool(repo->pool);
-}
-
-static inline Repo* pakfire_repo_get_solv_repo(PakfireRepo repo) {
-       return repo->repo;
-}
+Repo* pakfire_repo_get_repo(PakfireRepo repo);
+Repodata* pakfire_repo_get_repodata(PakfireRepo repo);
 
 #endif
 
index 06945bf22ea3a465cbbdc2c60733f3c2281075a4..5ab0b22e6adb9538ab657d94d3409ba38b40a43d 100644 (file)
@@ -223,7 +223,6 @@ global:
        pakfire_repo_count;
        pakfire_repo_clean;
        pakfire_repo_create;
-       pakfire_repo_free;
        pakfire_repo_get_cache;
        pakfire_repo_get_name;
        pakfire_repo_get_enabled;
@@ -234,11 +233,13 @@ global:
        pakfire_repo_pool;
        pakfire_repo_read_solv;
        pakfire_repo_read_solv_fp;
+       pakfire_repo_ref;
        pakfire_repo_set_enabled;
        pakfire_repo_set_name;
        pakfire_repo_set_priority;
        pakfire_repo_write_solv;
        pakfire_repo_write_solv_fp;
+       pakfire_repo_unref;
 
        # repocache
        pakfire_repocache_age;
index 742a75e2722b3a133c34097fd5f5898eac8ea3c2..2f350d5f6d5388a8d502475a14079a0e0b51a7ca 100644 (file)
@@ -162,13 +162,13 @@ PAKFIRE_EXPORT int pakfire_package_cmp(PakfirePackage pkg1, PakfirePackage pkg2)
 
        if (repo1 && repo2) {
                ret = pakfire_repo_cmp(repo1, repo2);
+       }
 
-               pakfire_repo_free(repo1);
-               pakfire_repo_free(repo2);
+       pakfire_repo_unref(repo1);
+       pakfire_repo_unref(repo2);
 
-               if (ret)
-                       return ret;
-       }
+       if (ret)
+               return ret;
 
        // Check package architectures
        str1 = pool_id2str(pool, s1->arch);
@@ -306,7 +306,7 @@ static void pakfire_package_internalize_repo(PakfirePackage pkg) {
        PakfireRepo repo = pakfire_package_get_repo(pkg);
        if (repo) {
                pakfire_repo_internalize(repo);
-               pakfire_repo_free(repo);
+               pakfire_repo_unref(repo);
        }
 }
 
@@ -638,7 +638,7 @@ PAKFIRE_EXPORT PakfireRepo pakfire_package_get_repo(PakfirePackage pkg) {
 PAKFIRE_EXPORT void pakfire_package_set_repo(PakfirePackage pkg, PakfireRepo repo) {
        Solvable* s = get_solvable(pkg);
 
-       s->repo = pakfire_repo_get_solv_repo(repo);
+       s->repo = pakfire_repo_get_repo(repo);
 }
 
 PAKFIRE_EXPORT char* pakfire_package_get_location(PakfirePackage pkg) {
@@ -754,7 +754,7 @@ PAKFIRE_EXPORT char* pakfire_package_dump(PakfirePackage pkg, int flags) {
                const char* repo_name = pakfire_repo_get_name(repo);
                pakfire_package_dump_add_line(&string, _("Repo"), repo_name);
 
-               pakfire_repo_free(repo);
+               pakfire_repo_unref(repo);
        }
 
        // Summary
@@ -887,8 +887,7 @@ PAKFIRE_EXPORT char* pakfire_package_get_cache_full_path(PakfirePackage pkg) {
        cache_path = pakfire_repocache_get_full_path(repo_cache, pkg_cache_path);
 
 out:
-       if (repo)
-               pakfire_repo_free(repo);
+       pakfire_repo_unref(repo);
 
        return cache_path;
 }
@@ -900,7 +899,7 @@ static PakfireFile pakfire_package_fetch_legacy_filelist(PakfirePackage pkg) {
        PakfireRepo repo = pakfire_package_get_repo(pkg);
        Solvable* s = get_solvable(pkg);
        Pool* p = pakfire_package_get_solv_pool(pkg);
-       Repo* r = pakfire_repo_get_solv_repo(repo);
+       Repo* r = pakfire_repo_get_repo(repo);
 
        int found_marker = 0;
 
@@ -931,6 +930,8 @@ static PakfireFile pakfire_package_fetch_legacy_filelist(PakfirePackage pkg) {
                file = pakfire_file_sort(file);
        }
 
+       pakfire_repo_unref(repo);
+
        return file;
 }
 
@@ -981,19 +982,22 @@ PAKFIRE_EXPORT PakfireFile pakfire_package_get_filelist(PakfirePackage pkg) {
 
 PAKFIRE_EXPORT PakfireFile pakfire_package_filelist_append(PakfirePackage pkg, const char* filename) {
        PakfireRepo repo = pakfire_package_get_repo(pkg);
+       Repodata* repodata = pakfire_repo_get_repodata(repo);
 
        Id handle = pakfire_package_get_handle(pkg);
 
        char* dirname  = pakfire_dirname(filename);
        char* basename = pakfire_basename(filename);
 
-       Id did = repodata_str2dir(repo->filelist, dirname, 1);
+       Id did = repodata_str2dir(repodata, dirname, 1);
        if (!did)
-               did = repodata_str2dir(repo->filelist, "/", 1);
+               did = repodata_str2dir(repodata, "/", 1);
 
-       repodata_add_dirstr(repo->filelist, handle,
+       repodata_add_dirstr(repodata, handle,
                SOLVABLE_FILELIST, did, basename);
 
+       pakfire_repo_unref(repo);
+
        return NULL;
 }
 
index ab37dfd246fb7869f0f06d13dc50f98491dc533b..6ad59bd918ff52e5574a8f59ce84545023727a33 100644 (file)
@@ -76,7 +76,7 @@ static void pakfire_pool_free_repos(Pool* pool) {
                if (r == NULL)
                        continue;
 
-               pakfire_repo_free(r);
+               pakfire_repo_unref(r);
        }
 }
 
@@ -151,8 +151,7 @@ PAKFIRE_EXPORT void pakfire_pool_set_installed_repo(PakfirePool pool, PakfireRep
                return;
        }
 
-       assert(pool == repo->pool);
-       pool_set_installed(pool->pool, repo->repo);
+       pool_set_installed(pool->pool, pakfire_repo_get_repo(repo));
 }
 
 PAKFIRE_EXPORT const char** pakfire_pool_get_installonly(PakfirePool pool) {
index 39ef4b64af176dc2effa01705d7abef6bc331999..bab4435fe499f98dace853506e3e783847697507 100644 (file)
@@ -31,6 +31,7 @@
 
 #include <pakfire/constants.h>
 #include <pakfire/errno.h>
+#include <pakfire/logging.h>
 #include <pakfire/package.h>
 #include <pakfire/pool.h>
 #include <pakfire/private.h>
 const uint8_t XZ_HEADER_MAGIC[] = { 0xFD, '7', 'z', 'X', 'Z', 0x00 };
 const size_t XZ_HEADER_LENGTH = sizeof(XZ_HEADER_MAGIC);
 
+struct _PakfireRepo {
+       PakfirePool pool;
+       Repo* repo;
+       PakfireRepoCache cache;
+       Repodata* filelist;
+       int nrefs;
+};
+
 static Repo* get_repo_by_name(Pool* pool, const char* name) {
        Repo* repo;
        int i;
@@ -82,42 +91,62 @@ PAKFIRE_EXPORT PakfireRepo pakfire_repo_create(PakfirePool pool, const char* nam
 }
 
 PAKFIRE_EXPORT PakfireRepo pakfire_repo_create_from_repo(PakfirePool pool, Repo* r) {
-       PakfireRepo repo;
+       // Return existing object if we have one
+       if (r->appdata)
+               return pakfire_repo_ref(r->appdata);
 
-       if (r->appdata) {
-               repo = r->appdata;
-               repo->nrefs++;
-
-       } else {
-               repo = pakfire_calloc(1, sizeof(*repo));
-               if (repo) {
-                       repo->pool = pool;
-
-                       repo->repo = r;
-                       repo->cache = pakfire_repocache_create(repo);
-                       repo->repo->appdata = repo;
+       PakfireRepo repo = r->appdata = pakfire_calloc(1, sizeof(*repo));
+       if (repo) {
+               DEBUG("Allocated Repo at %p\n", repo);
+               repo->nrefs = 1;
 
-                       repo->filelist = repo_add_repodata(r, REPO_EXTEND_SOLVABLES|REPO_LOCALPOOL|REPO_NO_INTERNALIZE|REPO_NO_LOCATION);
+               repo->pool = pakfire_pool_ref(pool);
+               repo->repo = r;
+               repo->cache = pakfire_repocache_create(repo);
 
-                       // Initialize reference counter
-                       repo->nrefs = 1;
-               }
+               repo->filelist = repo_add_repodata(r,
+                       REPO_EXTEND_SOLVABLES|REPO_LOCALPOOL|REPO_NO_INTERNALIZE|REPO_NO_LOCATION);
        }
 
        return repo;
 }
 
-PAKFIRE_EXPORT void pakfire_repo_free(PakfireRepo repo) {
-       if (--repo->nrefs > 0)
-               return;
+PAKFIRE_EXPORT PakfireRepo pakfire_repo_ref(PakfireRepo repo) {
+       repo->nrefs++;
+
+       return repo;
+}
 
+static void pakfire_repo_free(PakfireRepo repo) {
        if (repo->repo)
                repo->repo->appdata = NULL;
 
        if (repo->cache)
                pakfire_repocache_free(repo->cache);
 
+       pakfire_pool_unref(repo->pool);
+
        pakfire_free(repo);
+       DEBUG("Released Repo at %p\n", repo);
+}
+
+PAKFIRE_EXPORT PakfireRepo pakfire_repo_unref(PakfireRepo repo) {
+       if (!repo)
+               return NULL;
+
+       if (--repo->nrefs > 0)
+               return repo;
+
+       pakfire_repo_free(repo);
+       return NULL;
+}
+
+Repo* pakfire_repo_get_repo(PakfireRepo repo) {
+       return repo->repo;
+}
+
+Repodata* pakfire_repo_get_repodata(PakfireRepo repo) {
+       return repo->filelist;
 }
 
 PAKFIRE_EXPORT PakfirePool pakfire_repo_pool(PakfireRepo repo) {
@@ -145,7 +174,7 @@ PAKFIRE_EXPORT int pakfire_repo_cmp(PakfireRepo repo1, PakfireRepo repo2) {
 }
 
 PAKFIRE_EXPORT int pakfire_repo_count(PakfireRepo repo) {
-       Pool* pool = pakfire_repo_solv_pool(repo);
+       Pool* pool = pakfire_pool_get_solv_pool(repo->pool);
        int cnt = 0;
 
        for (int i = 2; i < pool->nsolvables; i++) {
index bdf3079227dd49448271b5cde00f14bc6a3d5e7c..acd3464356a568d687d4236909f13a16e75e50ac 100644 (file)
@@ -196,7 +196,7 @@ static void pakfire_transaction_add_package(char** str, size_t width, PakfirePac
                size_str
        );
 
-       pakfire_repo_free(repo);
+       pakfire_repo_unref(repo);
        pakfire_free(size_str);
 }