Optimize most common path when resolving package dependencies.

Before that change the code would do the following:
	1- if dependency is installed, continue
	2- if dependency is queued, continue
	3- get dependency from repos

After that change the code does this:
	1- if dependency is queued, continue
	2- if dependency is installed, continue
	3- get dependency from repos

So the dependency is checked if it has been queued as the first phase, which
seems to be the most common path in most cases.
This commit is contained in:
Juan RP 2014-03-16 18:08:59 +01:00
parent 4b20a6b512
commit d01d2edf5b

View File

@ -155,7 +155,7 @@ find_repo_deps(struct xbps_handle *xhp,
const char *curpkg, /* current pkgver */ const char *curpkg, /* current pkgver */
unsigned short *depth) /* max recursion depth */ unsigned short *depth) /* max recursion depth */
{ {
xbps_dictionary_t curpkgd, tmpd; xbps_dictionary_t curpkgd = NULL;
xbps_object_t obj; xbps_object_t obj;
xbps_object_iterator_t iter; xbps_object_iterator_t iter;
xbps_array_t curpkgrdeps; xbps_array_t curpkgrdeps;
@ -191,11 +191,22 @@ find_repo_deps(struct xbps_handle *xhp,
break; break;
} }
/* /*
* Pass 1: check if required dependency is already installed * Pass 1: check if required dependency has been already
* added in the transaction dictionary.
*/
if ((curpkgd = xbps_find_pkg_in_array(unsorted, reqpkg)) ||
(curpkgd = xbps_find_virtualpkg_in_array(xhp, unsorted, reqpkg))) {
xbps_dictionary_get_cstring_nocopy(curpkgd,
"pkgver", &pkgver_q);
xbps_dbg_printf_append(xhp, " (%s queued)\n", pkgver_q);
continue;
}
/*
* Pass 2: check if required dependency is already installed
* and its version is fully matched. * and its version is fully matched.
*/ */
if (((tmpd = xbps_pkgdb_get_pkg(xhp, pkgname)) == NULL) && if (((curpkgd = xbps_pkgdb_get_pkg(xhp, pkgname)) == NULL) &&
((tmpd = xbps_pkgdb_get_virtualpkg(xhp, pkgname)) == NULL)) { ((curpkgd = xbps_pkgdb_get_virtualpkg(xhp, pkgname)) == NULL)) {
if (errno && errno != ENOENT) { if (errno && errno != ENOENT) {
/* error */ /* error */
rv = errno; rv = errno;
@ -216,13 +227,13 @@ find_repo_deps(struct xbps_handle *xhp,
* Check if installed version matches the * Check if installed version matches the
* required pkgdep version. * required pkgdep version.
*/ */
xbps_dictionary_get_cstring_nocopy(tmpd, xbps_dictionary_get_cstring_nocopy(curpkgd,
"pkgver", &pkgver_q); "pkgver", &pkgver_q);
/* Check its state */ /* Check its state */
if ((rv = xbps_pkg_state_dictionary(tmpd, &state)) != 0) if ((rv = xbps_pkg_state_dictionary(curpkgd, &state)) != 0)
break; break;
if (xbps_match_virtual_pkg_in_dict(tmpd,reqpkg,true)) { if (xbps_match_virtual_pkg_in_dict(curpkgd, reqpkg, true)) {
/* /*
* Check if required dependency is a virtual * Check if required dependency is a virtual
* package and is satisfied by an * package and is satisfied by an
@ -243,7 +254,7 @@ find_repo_deps(struct xbps_handle *xhp,
xbps_dbg_printf_append(xhp, xbps_dbg_printf_append(xhp,
"installed `%s', " "installed `%s', "
"must be updated.", pkgver_q); "must be updated.", pkgver_q);
if (xbps_dictionary_get(tmpd, "hold")) if (xbps_dictionary_get(curpkgd, "hold"))
xbps_dbg_printf_append(xhp, " on hold state! ignoring update.\n"); xbps_dbg_printf_append(xhp, " on hold state! ignoring update.\n");
else { else {
xbps_dbg_printf_append(xhp, "\n"); xbps_dbg_printf_append(xhp, "\n");
@ -280,17 +291,6 @@ find_repo_deps(struct xbps_handle *xhp,
break; break;
} }
} }
/*
* Pass 2: check if required dependency has been already
* added in the transaction dictionary.
*/
if ((curpkgd = xbps_find_pkg_in_array(unsorted, reqpkg)) ||
(curpkgd = xbps_find_virtualpkg_in_array(xhp, unsorted, reqpkg))) {
xbps_dictionary_get_cstring_nocopy(curpkgd,
"pkgver", &pkgver_q);
xbps_dbg_printf_append(xhp, " (%s queued)\n", pkgver_q);
continue;
}
/* /*
* Pass 3: find required dependency in repository pool. * Pass 3: find required dependency in repository pool.
* If dependency does not match add pkg into the missing * If dependency does not match add pkg into the missing