From 429162ba11e58758e5e4ac4f03239891fc3e189c Mon Sep 17 00:00:00 2001 From: Karen Arutyunov Date: Tue, 12 Dec 2017 16:04:02 +0300 Subject: Merge with latest upstream package version (master branch) --- libpkgconf/pkg.c | 57 ++++++++++++++++++++++++++++++++------------------------ 1 file changed, 33 insertions(+), 24 deletions(-) (limited to 'libpkgconf/pkg.c') diff --git a/libpkgconf/pkg.c b/libpkgconf/pkg.c index 3e3268a..6918d6d 100644 --- a/libpkgconf/pkg.c +++ b/libpkgconf/pkg.c @@ -181,7 +181,7 @@ static const pkgconf_pkg_parser_keyword_pair_t pkgconf_pkg_parser_keyword_funcs[ {"LIBS.private", pkgconf_pkg_parser_fragment_func, offsetof(pkgconf_pkg_t, libs_private)}, {"Name", pkgconf_pkg_parser_tuple_func, offsetof(pkgconf_pkg_t, realname)}, {"Provides", pkgconf_pkg_parser_dependency_func, offsetof(pkgconf_pkg_t, provides)}, - {"Requires", pkgconf_pkg_parser_dependency_func, offsetof(pkgconf_pkg_t, requires_)}, + {"Requires", pkgconf_pkg_parser_dependency_func, offsetof(pkgconf_pkg_t, required)}, {"Requires.private", pkgconf_pkg_parser_dependency_func, offsetof(pkgconf_pkg_t, requires_private)}, {"Version", pkgconf_pkg_parser_tuple_func, offsetof(pkgconf_pkg_t, version)}, }; @@ -423,7 +423,7 @@ pkgconf_pkg_free(pkgconf_client_t *client, pkgconf_pkg_t *pkg) pkgconf_cache_remove(client, pkg); - pkgconf_dependency_free(&pkg->requires_); + pkgconf_dependency_free(&pkg->required); pkgconf_dependency_free(&pkg->requires_private); pkgconf_dependency_free(&pkg->conflicts); pkgconf_dependency_free(&pkg->provides); @@ -475,11 +475,15 @@ pkgconf_pkg_free(pkgconf_client_t *client, pkgconf_pkg_t *pkg) * :rtype: pkgconf_pkg_t * */ pkgconf_pkg_t * -pkgconf_pkg_ref(const pkgconf_client_t *client, pkgconf_pkg_t *pkg) +pkgconf_pkg_ref(pkgconf_client_t *client, pkgconf_pkg_t *pkg) { - (void) client; + if (pkg->owner != NULL && pkg->owner != client) + PKGCONF_TRACE(client, "WTF: client %p refers to package %p owned by other client %p", client, pkg, pkg->owner); + pkg->owner = client; pkg->refcount++; + PKGCONF_TRACE(client, "refcount@%p: %d", pkg, pkg->refcount); + return pkg; } @@ -497,9 +501,14 @@ pkgconf_pkg_ref(const pkgconf_client_t *client, pkgconf_pkg_t *pkg) void pkgconf_pkg_unref(pkgconf_client_t *client, pkgconf_pkg_t *pkg) { + if (pkg->owner != NULL && pkg->owner != client) + PKGCONF_TRACE(client, "WTF: client %p unrefs package %p owned by other client %p", client, pkg, pkg->owner); + pkg->refcount--; + PKGCONF_TRACE(pkg->owner, "refcount@%p: %d", pkg, pkg->refcount); + if (pkg->refcount <= 0) - pkgconf_pkg_free(client, pkg); + pkgconf_pkg_free(pkg->owner, pkg); } static inline pkgconf_pkg_t * @@ -1264,6 +1273,12 @@ pkgconf_pkg_verify_dependency(pkgconf_client_t *client, pkgconf_dependency_t *pk PKGCONF_TRACE(client, "trying to verify dependency: %s", pkgdep->package); + if (pkgdep->match != NULL) + { + PKGCONF_TRACE(client, "cached dependency: %s -> %s@%p", pkgdep->package, pkgdep->match->id, pkgdep->match); + return pkgconf_pkg_ref(client, pkgdep->match); + } + pkg = pkgconf_pkg_find(client, pkgdep->package); if (pkg == NULL) { @@ -1281,11 +1296,13 @@ pkgconf_pkg_verify_dependency(pkgconf_client_t *client, pkgconf_dependency_t *pk if (pkg->id == NULL) pkg->id = strdup(pkgdep->package); - if (pkgconf_pkg_comparator_impls[pkgdep->compare](pkg->version, pkgdep->version) == true) - return pkg; - - if (eflags != NULL) - *eflags |= PKGCONF_PKG_ERRF_PACKAGE_VER_MISMATCH; + if (pkgconf_pkg_comparator_impls[pkgdep->compare](pkg->version, pkgdep->version) != true) + { + if (eflags != NULL) + *eflags |= PKGCONF_PKG_ERRF_PACKAGE_VER_MISMATCH; + } + else + pkgdep->match = pkgconf_pkg_ref(client, pkg); return pkg; } @@ -1331,11 +1348,7 @@ pkgconf_pkg_report_graph_error(pkgconf_client_t *client, pkgconf_pkg_t *parent, pkgconf_error(client, "Package dependency requirement '%s %s %s' could not be satisfied.\n", node->package, pkgconf_pkg_get_comparator(node), node->version); - /* - * Add support for PKGCONF_PKG_PKGF_SIMPLIFY_ERRORS flag (issue #134 is - * reported). - */ - if (pkg != NULL && !(client->flags & PKGCONF_PKG_PKGF_SIMPLIFY_ERRORS)) + if (pkg != NULL) pkgconf_error(client, "Package '%s' has version '%s', required version is '%s %s'\n", node->package, pkg->version, pkgconf_pkg_get_comparator(node), node->version); } @@ -1408,7 +1421,7 @@ pkgconf_pkg_walk_conflicts_list(pkgconf_client_t *client, if (*parentnode->package == '\0') continue; - PKGCONF_FOREACH_LIST_ENTRY(root->requires_.head, childnode) + PKGCONF_FOREACH_LIST_ENTRY(root->required.head, childnode) { pkgconf_pkg_t *pkgdep; pkgconf_dependency_t *depnode = childnode->data; @@ -1423,15 +1436,11 @@ pkgconf_pkg_walk_conflicts_list(pkgconf_client_t *client, pkgdep->version, pkgdep->realname, root->realname, parentnode->package, pkgconf_pkg_get_comparator(parentnode), parentnode->version != NULL ? " " : "", parentnode->version != NULL ? parentnode->version : ""); - /* - * Add support for PKGCONF_PKG_PKGF_SIMPLIFY_ERRORS flag (issue #134 is - * reported). - */ - if (!(client->flags & PKGCONF_PKG_PKGF_SIMPLIFY_ERRORS)) - { + if (!(client->flags & PKGCONF_PKG_PKGF_SIMPLIFY_ERRORS)) + { pkgconf_error(client, "It may be possible to ignore this conflict and continue, try the\n"); pkgconf_error(client, "PKG_CONFIG_IGNORE_CONFLICTS environment variable.\n"); - } + } pkgconf_pkg_unref(client, pkgdep); @@ -1488,7 +1497,7 @@ pkgconf_pkg_traverse(pkgconf_client_t *client, } PKGCONF_TRACE(client, "%s: walking requires list", root->id); - eflags = pkgconf_pkg_walk_list(client, root, &root->requires_, func, data, maxdepth); + eflags = pkgconf_pkg_walk_list(client, root, &root->required, func, data, maxdepth); if (eflags != PKGCONF_PKG_ERRF_OK) return eflags; -- cgit v1.1