aboutsummaryrefslogtreecommitdiff
path: root/libpkgconf/pkg.c
diff options
context:
space:
mode:
authorKaren Arutyunov <karen@codesynthesis.com>2017-12-12 16:04:02 +0300
committerKaren Arutyunov <karen@codesynthesis.com>2017-12-12 16:04:02 +0300
commit429162ba11e58758e5e4ac4f03239891fc3e189c (patch)
treea530c0621a5cb3fe18c8d85392658458d02d6ea1 /libpkgconf/pkg.c
parenta18413342bc088e10a56ff70dca8f3007a83085d (diff)
Merge with latest upstream package version (master branch)
Diffstat (limited to 'libpkgconf/pkg.c')
-rw-r--r--libpkgconf/pkg.c57
1 files changed, 33 insertions, 24 deletions
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;