From: Michael Tremer Date: Mon, 15 Jan 2018 16:50:33 +0000 (+0100) Subject: libpakfire: Make Repo opague and implement refcounting X-Git-Tag: 0.9.28~1285^2~1187 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=3ff6aee69f39e9c3fbb8651bfb53c6d5e04fb24a;p=pakfire.git libpakfire: Make Repo opague and implement refcounting Signed-off-by: Michael Tremer --- diff --git a/src/_pakfire/package.c b/src/_pakfire/package.c index f6e68a371..42027ba95 100644 --- a/src/_pakfire/package.c +++ b/src/_pakfire/package.c @@ -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); } diff --git a/src/_pakfire/repo.c b/src/_pakfire/repo.c index 038e79d8e..25d5d19a9 100644 --- a/src/_pakfire/repo.c +++ b/src/_pakfire/repo.c @@ -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); diff --git a/src/_pakfire/repo.h b/src/_pakfire/repo.h index 4fe2e2108..5780a7c73 100644 --- a/src/_pakfire/repo.h +++ b/src/_pakfire/repo.h @@ -34,7 +34,7 @@ typedef struct { PakfireRepo repo; // XXX COMPAT - Repo* _repo; + void* _repo; } RepoObject; extern PyTypeObject RepoType; diff --git a/src/libpakfire/include/pakfire/repo.h b/src/libpakfire/include/pakfire/repo.h index 20b8f8e63..9c00d860a 100644 --- a/src/libpakfire/include/pakfire/repo.h +++ b/src/libpakfire/include/pakfire/repo.h @@ -21,13 +21,12 @@ #ifndef PAKFIRE_REPO_H #define PAKFIRE_REPO_H -#include - #include 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 - 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 diff --git a/src/libpakfire/libpakfire.sym b/src/libpakfire/libpakfire.sym index 06945bf22..5ab0b22e6 100644 --- a/src/libpakfire/libpakfire.sym +++ b/src/libpakfire/libpakfire.sym @@ -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; diff --git a/src/libpakfire/package.c b/src/libpakfire/package.c index 742a75e27..2f350d5f6 100644 --- a/src/libpakfire/package.c +++ b/src/libpakfire/package.c @@ -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; } diff --git a/src/libpakfire/pool.c b/src/libpakfire/pool.c index ab37dfd24..6ad59bd91 100644 --- a/src/libpakfire/pool.c +++ b/src/libpakfire/pool.c @@ -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) { diff --git a/src/libpakfire/repo.c b/src/libpakfire/repo.c index 39ef4b64a..bab4435fe 100644 --- a/src/libpakfire/repo.c +++ b/src/libpakfire/repo.c @@ -31,6 +31,7 @@ #include #include +#include #include #include #include @@ -42,6 +43,14 @@ 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++) { diff --git a/src/libpakfire/transaction.c b/src/libpakfire/transaction.c index bdf307922..acd346435 100644 --- a/src/libpakfire/transaction.c +++ b/src/libpakfire/transaction.c @@ -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); }