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>
This commit is contained in:
parent
34a78d935a
commit
735a197fc2
|
@ -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;
|
||||
|
||||
|
|
|
@ -29,9 +29,10 @@
|
|||
|
||||
/* Dependency */
|
||||
struct __pmdepend_t {
|
||||
pmdepmod_t mod;
|
||||
char *name;
|
||||
char *version;
|
||||
long name_hash;
|
||||
pmdepmod_t mod;
|
||||
};
|
||||
|
||||
/* Missing dependency */
|
||||
|
|
Loading…
Reference in New Issue