Move alpm_splitdep usage to db_read

Holy inefficient batman! For a pacman -Qt operation (when we are using
compute_requiredby and not database entries), splitdep was being called ~1.3
million times on my local database. By splitting when we read the DB, we
drop this number to around 1700 and save a LOT of time in doing so (a 5x
increase in pacman -Qt speed here).

Note that the depends alpm_list_t in the package struct is no longer a
string list, but a list of pmdepent_t objects.

Signed-off-by: Dan McGee <dan@archlinux.org>
This commit is contained in:
Dan McGee 2007-11-12 23:01:14 -06:00
parent 8757398a7e
commit c244cfecf6
3 changed files with 22 additions and 41 deletions

View File

@ -44,6 +44,7 @@
#include "handle.h" #include "handle.h"
#include "package.h" #include "package.h"
#include "delta.h" #include "delta.h"
#include "deps.h"
/* This function is used to convert the downloaded db file to the proper backend /* This function is used to convert the downloaded db file to the proper backend
@ -455,7 +456,8 @@ int _alpm_db_read(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq)
_alpm_strtrim(line); _alpm_strtrim(line);
if(!strcmp(line, "%DEPENDS%")) { if(!strcmp(line, "%DEPENDS%")) {
while(fgets(line, 512, fp) && strlen(_alpm_strtrim(line))) { while(fgets(line, 512, fp) && strlen(_alpm_strtrim(line))) {
info->depends = alpm_list_add(info->depends, strdup(line)); pmdepend_t *dep = alpm_splitdep(line);
info->depends = alpm_list_add(info->depends, dep);
} }
} else if(!strcmp(line, "%OPTDEPENDS%")) { } else if(!strcmp(line, "%OPTDEPENDS%")) {
while(fgets(line, 512, fp) && strlen(_alpm_strtrim(line))) { while(fgets(line, 512, fp) && strlen(_alpm_strtrim(line))) {
@ -670,7 +672,9 @@ int _alpm_db_write(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq)
if(info->depends) { if(info->depends) {
fputs("%DEPENDS%\n", fp); fputs("%DEPENDS%\n", fp);
for(lp = info->depends; lp; lp = lp->next) { for(lp = info->depends; lp; lp = lp->next) {
fprintf(fp, "%s\n", (char *)lp->data); char *depstring = alpm_dep_get_string(lp->data);
fprintf(fp, "%s\n", depstring);
free(depstring);
} }
fprintf(fp, "\n"); fprintf(fp, "\n");
} }

View File

@ -130,9 +130,8 @@ static alpm_list_t *_alpm_graph_init(alpm_list_t *targets)
pmpkg_t *p_j = vertex_j->data; pmpkg_t *p_j = vertex_j->data;
int child = 0; int child = 0;
for(k = alpm_pkg_get_depends(p_i); k && !child; k = k->next) { for(k = alpm_pkg_get_depends(p_i); k && !child; k = k->next) {
pmdepend_t *depend = alpm_splitdep(k->data); pmdepend_t *depend = k->data;
child = alpm_depcmp(p_j, depend); child = alpm_depcmp(p_j, depend);
free(depend);
} }
if(child) { if(child) {
vertex_i->children = vertex_i->children =
@ -290,10 +289,7 @@ alpm_list_t *_alpm_checkdeps(pmdb_t *db, pmtranstype_t op,
for(k = alpm_pkg_get_depends(p); k; k = k->next) { for(k = alpm_pkg_get_depends(p); k; k = k->next) {
/* don't break any existing dependencies (possible provides) */ /* don't break any existing dependencies (possible provides) */
pmdepend_t *depend = alpm_splitdep(k->data); pmdepend_t *depend = k->data;
if(depend == NULL) {
continue;
}
/* if oldpkg satisfied this dep, and newpkg doesn't */ /* if oldpkg satisfied this dep, and newpkg doesn't */
if(alpm_depcmp(oldpkg, depend) && !alpm_depcmp(newpkg, depend)) { if(alpm_depcmp(oldpkg, depend) && !alpm_depcmp(newpkg, depend)) {
@ -305,7 +301,8 @@ alpm_list_t *_alpm_checkdeps(pmdb_t *db, pmtranstype_t op,
if(alpm_depcmp(pkg, depend)) { if(alpm_depcmp(pkg, depend)) {
_alpm_log(PM_LOG_DEBUG, "checkdeps: dependency '%s' has moved from '%s' to '%s'\n", _alpm_log(PM_LOG_DEBUG, "checkdeps: dependency '%s' has moved from '%s' to '%s'\n",
(char*)k->data, alpm_pkg_get_name(oldpkg), alpm_pkg_get_name(pkg)); depend->name,
alpm_pkg_get_name(oldpkg), alpm_pkg_get_name(pkg));
satisfied = 1; satisfied = 1;
break; break;
} }
@ -321,7 +318,7 @@ alpm_list_t *_alpm_checkdeps(pmdb_t *db, pmtranstype_t op,
/* we ignore packages that will be updated because we know /* we ignore packages that will be updated because we know
* that the updated ones don't satisfy depend */ * that the updated ones don't satisfy depend */
_alpm_log(PM_LOG_DEBUG, "checkdeps: dependency '%s' satisfied by installed package '%s'\n", _alpm_log(PM_LOG_DEBUG, "checkdeps: dependency '%s' satisfied by installed package '%s'\n",
(char*)k->data, alpm_pkg_get_name(pkg)); depend->name, alpm_pkg_get_name(pkg));
satisfied = 1; satisfied = 1;
break; break;
} }
@ -340,7 +337,6 @@ alpm_list_t *_alpm_checkdeps(pmdb_t *db, pmtranstype_t op,
} }
} }
} }
FREE(depend);
} }
} }
FREELIST(requiredby); FREELIST(requiredby);
@ -358,11 +354,7 @@ alpm_list_t *_alpm_checkdeps(pmdb_t *db, pmtranstype_t op,
alpm_pkg_get_name(tp), alpm_pkg_get_version(tp)); alpm_pkg_get_name(tp), alpm_pkg_get_version(tp));
for(j = alpm_pkg_get_depends(tp); j; j = j->next) { for(j = alpm_pkg_get_depends(tp); j; j = j->next) {
/* split into name/version pairs */ pmdepend_t *depend = j->data;
pmdepend_t *depend = alpm_splitdep((char*)j->data);
if(depend == NULL) {
continue;
}
found = 0; found = 0;
/* check other targets */ /* check other targets */
@ -391,7 +383,6 @@ alpm_list_t *_alpm_checkdeps(pmdb_t *db, pmtranstype_t op,
FREE(miss); FREE(miss);
} }
} }
FREE(depend);
} }
} }
} else if(op == PM_TRANS_TYPE_REMOVE) { } else if(op == PM_TRANS_TYPE_REMOVE) {
@ -419,10 +410,8 @@ alpm_list_t *_alpm_checkdeps(pmdb_t *db, pmtranstype_t op,
continue; continue;
} }
for(k = alpm_pkg_get_depends(p); k; k = k->next) { for(k = alpm_pkg_get_depends(p); k; k = k->next) {
pmdepend_t *depend = alpm_splitdep(k->data); pmdepend_t *depend = k->data;
if(depend == NULL) {
continue;
}
/* if rmpkg satisfied this dep, try to find an other satisfier /* if rmpkg satisfied this dep, try to find an other satisfier
* (which won't be removed)*/ * (which won't be removed)*/
if(alpm_depcmp(rmpkg, depend)) { if(alpm_depcmp(rmpkg, depend)) {
@ -450,7 +439,6 @@ alpm_list_t *_alpm_checkdeps(pmdb_t *db, pmtranstype_t op,
} }
} }
} }
FREE(depend);
} }
} }
FREELIST(requiredby); FREELIST(requiredby);
@ -626,10 +614,8 @@ void _alpm_recursedeps(pmdb_t *db, alpm_list_t *targs, int include_explicit)
for(i = targs; i; i = i->next) { for(i = targs; i; i = i->next) {
pmpkg_t *pkg = i->data; pmpkg_t *pkg = i->data;
for(j = alpm_pkg_get_depends(pkg); j; j = j->next) { for(j = alpm_pkg_get_depends(pkg); j; j = j->next) {
pmdepend_t *depend = alpm_splitdep(j->data); pmdepend_t *depend = j->data;
if(depend == NULL) {
continue;
}
for(k = _alpm_db_get_pkgcache(db); k; k = k->next) { for(k = _alpm_db_get_pkgcache(db); k; k = k->next) {
pmpkg_t *deppkg = k->data; pmpkg_t *deppkg = k->data;
if(alpm_depcmp(deppkg,depend) if(alpm_depcmp(deppkg,depend)
@ -640,7 +626,6 @@ void _alpm_recursedeps(pmdb_t *db, alpm_list_t *targs, int include_explicit)
targs = alpm_list_add(targs, _alpm_pkg_dup(deppkg)); targs = alpm_list_add(targs, _alpm_pkg_dup(deppkg));
} }
} }
FREE(depend);
} }
} }
} }
@ -799,7 +784,7 @@ pmdepend_t SYMEXPORT *alpm_miss_get_dep(pmdepmissing_t *miss)
/* Sanity checks */ /* Sanity checks */
ASSERT(miss != NULL, return(NULL)); ASSERT(miss != NULL, return(NULL));
return &miss->depend; return &(miss->depend);
} }
pmdepmod_t SYMEXPORT alpm_dep_get_mod(const pmdepend_t *dep) pmdepmod_t SYMEXPORT alpm_dep_get_mod(const pmdepend_t *dep)

View File

@ -49,7 +49,7 @@
#include "delta.h" #include "delta.h"
#include "provide.h" #include "provide.h"
#include "handle.h" #include "handle.h"
#include "alpm.h" #include "deps.h"
/** \addtogroup alpm_packages Package Functions /** \addtogroup alpm_packages Package Functions
* @brief Functions to manipulate libalpm packages * @brief Functions to manipulate libalpm packages
@ -527,22 +527,13 @@ alpm_list_t SYMEXPORT *alpm_pkg_compute_requiredby(pmpkg_t *pkg)
const char *cachepkgname = alpm_pkg_get_name(cachepkg); const char *cachepkgname = alpm_pkg_get_name(cachepkg);
for(j = alpm_pkg_get_depends(cachepkg); j; j = j->next) { for(j = alpm_pkg_get_depends(cachepkg); j; j = j->next) {
pmdepend_t *dep; pmdepend_t *dep = j->data;
if(!j->data) {
continue;
}
dep = alpm_splitdep(j->data);
if(dep == NULL) {
continue;
}
if(alpm_depcmp(pkg, dep)) { if(alpm_depcmp(pkg, dep)) {
_alpm_log(PM_LOG_DEBUG, "adding '%s' in requiredby field for '%s'\n", _alpm_log(PM_LOG_DEBUG, "adding '%s' in requiredby field for '%s'\n",
cachepkgname, pkg->name); cachepkgname, pkg->name);
reqs = alpm_list_add(reqs, strdup(cachepkgname)); reqs = alpm_list_add(reqs, strdup(cachepkgname));
} }
FREE(dep);
} }
} }
return(reqs); return(reqs);
@ -684,7 +675,7 @@ pmpkg_t *_alpm_pkg_dup(pmpkg_t *pkg)
newpkg->conflicts = alpm_list_strdup(alpm_pkg_get_conflicts(pkg)); newpkg->conflicts = alpm_list_strdup(alpm_pkg_get_conflicts(pkg));
newpkg->files = alpm_list_strdup(alpm_pkg_get_files(pkg)); newpkg->files = alpm_list_strdup(alpm_pkg_get_files(pkg));
newpkg->backup = alpm_list_strdup(alpm_pkg_get_backup(pkg)); newpkg->backup = alpm_list_strdup(alpm_pkg_get_backup(pkg));
newpkg->depends = alpm_list_strdup(alpm_pkg_get_depends(pkg)); newpkg->depends = alpm_list_copy_data(alpm_pkg_get_depends(pkg));
newpkg->optdepends = alpm_list_strdup(alpm_pkg_get_optdepends(pkg)); newpkg->optdepends = alpm_list_strdup(alpm_pkg_get_optdepends(pkg));
newpkg->groups = alpm_list_strdup(alpm_pkg_get_groups(pkg)); newpkg->groups = alpm_list_strdup(alpm_pkg_get_groups(pkg));
newpkg->provides = alpm_list_strdup(alpm_pkg_get_provides(pkg)); newpkg->provides = alpm_list_strdup(alpm_pkg_get_provides(pkg));
@ -851,7 +842,8 @@ static int parse_descfile(const char *descfile, pmpkg_t *info)
/* size in the raw package is uncompressed (installed) size */ /* size in the raw package is uncompressed (installed) size */
info->isize = atol(ptr); info->isize = atol(ptr);
} else if(!strcmp(key, "depend")) { } else if(!strcmp(key, "depend")) {
info->depends = alpm_list_add(info->depends, strdup(ptr)); pmdepend_t *dep = alpm_splitdep(ptr);
info->depends = alpm_list_add(info->depends, dep);
} else if(!strcmp(key, "optdepend")) { } else if(!strcmp(key, "optdepend")) {
info->optdepends = alpm_list_add(info->optdepends, strdup(ptr)); info->optdepends = alpm_list_add(info->optdepends, strdup(ptr));
} else if(!strcmp(key, "conflict")) { } else if(!strcmp(key, "conflict")) {