diff options
author | Dan McGee <dan@archlinux.org> | 2010-12-21 22:40:04 +0100 |
---|---|---|
committer | Dan McGee <dan@archlinux.org> | 2010-12-22 00:25:34 +0100 |
commit | 735a197fc29b6b85a64cae5a6fa95e1209552c3b (patch) | |
tree | ffc24707b052f62ac671a75e3228dc81cf60ec59 | |
parent | 34a78d935ac44fc73becc8bba213cdf0268bb5e0 (diff) | |
download | pacman-735a197fc29b6b85a64cae5a6fa95e1209552c3b.tar.gz pacman-735a197fc29b6b85a64cae5a6fa95e1209552c3b.tar.xz |
Use name hashes in depends to avoid strcmp calls
Just like we did for package name comparsions, if we add a depend name_hash
field on depend struct initialization, we can use it instead of doing a
string name comparison, saving us a lot of checks in the depcmp code.
Signed-off-by: Dan McGee <dan@archlinux.org>
-rw-r--r-- | lib/libalpm/deps.c | 23 | ||||
-rw-r--r-- | lib/libalpm/deps.h | 3 |
2 files changed, 18 insertions, 8 deletions
diff --git a/lib/libalpm/deps.c b/lib/libalpm/deps.c index e37eb02e..2ed9d30a 100644 --- a/lib/libalpm/deps.c +++ b/lib/libalpm/deps.c @@ -322,15 +322,20 @@ static int dep_vercmp(const char *version1, pmdepmod_t mod, int _alpm_depcmp(pmpkg_t *pkg, pmdepend_t *dep) { alpm_list_t *i; - const char *pkgname = alpm_pkg_get_name(pkg); - const char *pkgversion = alpm_pkg_get_version(pkg); + const char *pkgname = pkg->name; + const char *pkgversion = pkg->version; int satisfy = 0; /* check (pkg->name, pkg->version) */ - satisfy = (strcmp(pkgname, dep->name) == 0 - && dep_vercmp(pkgversion, dep->mod, dep->version)); - if(satisfy) { - return(satisfy); + if(pkg->name_hash && dep->name_hash + && pkg->name_hash != dep->name_hash) { + /* skip more expensive checks */ + } else { + satisfy = (strcmp(pkgname, dep->name) == 0 + && dep_vercmp(pkgversion, dep->mod, dep->version)); + if(satisfy) { + return(satisfy); + } } /* check provisions, format : "name=version" */ @@ -380,7 +385,8 @@ pmdepend_t *_alpm_splitdep(const char *depstring) depend->mod = PM_DEP_MOD_LE; *ptr = '\0'; ptr += 2; - } else if((ptr = strstr(newstr, "="))) { /* Note: we must do =,<,> checks after <=, >= checks */ + } else if((ptr = strstr(newstr, "="))) { + /* Note: we must do =,<,> checks after <=, >= checks */ depend->mod = PM_DEP_MOD_EQ; *ptr = '\0'; ptr += 1; @@ -396,6 +402,7 @@ pmdepend_t *_alpm_splitdep(const char *depstring) /* no version specified - copy the name and return it */ depend->mod = PM_DEP_MOD_ANY; STRDUP(depend->name, newstr, RET_ERR(PM_ERR_MEMORY, NULL)); + depend->name_hash = _alpm_hash_sdbm(depend->name); depend->version = NULL; free(newstr); return(depend); @@ -404,6 +411,7 @@ pmdepend_t *_alpm_splitdep(const char *depstring) /* if we get here, we have a version comparator, copy the right parts * to the right places */ STRDUP(depend->name, newstr, RET_ERR(PM_ERR_MEMORY, NULL)); + depend->name_hash = _alpm_hash_sdbm(depend->name); STRDUP(depend->version, ptr, RET_ERR(PM_ERR_MEMORY, NULL)); free(newstr); @@ -416,6 +424,7 @@ pmdepend_t *_alpm_dep_dup(const pmdepend_t *dep) CALLOC(newdep, 1, sizeof(pmdepend_t), RET_ERR(PM_ERR_MEMORY, NULL)); STRDUP(newdep->name, dep->name, RET_ERR(PM_ERR_MEMORY, NULL)); + newdep->name_hash = dep->name_hash; STRDUP(newdep->version, dep->version, RET_ERR(PM_ERR_MEMORY, NULL)); newdep->mod = dep->mod; diff --git a/lib/libalpm/deps.h b/lib/libalpm/deps.h index 6fa763e1..b720b364 100644 --- a/lib/libalpm/deps.h +++ b/lib/libalpm/deps.h @@ -29,9 +29,10 @@ /* Dependency */ struct __pmdepend_t { - pmdepmod_t mod; char *name; char *version; + long name_hash; + pmdepmod_t mod; }; /* Missing dependency */ |