RPM Package Manager, CVS Repository http://rpm5.org/cvs/ ____________________________________________________________________________
Server: rpm5.org Name: Jeff Johnson Root: /v/rpm/cvs Email: j...@rpm5.org Module: rpm Date: 03-Jan-2011 22:20:24 Branch: HEAD Handle: 2011010321202201 Modified files: rpm CHANGES rpm/lib rpmds.c rpm/rpmdb rpmns.c rpmns.h Log: - rpmns: optimize out strlen() calls on depsolver fast path. Summary: Revision Changes Path 1.3543 +1 -0 rpm/CHANGES 2.171 +0 -1 rpm/lib/rpmds.c 1.16 +87 -77 rpm/rpmdb/rpmns.c 1.6 +8 -6 rpm/rpmdb/rpmns.h ____________________________________________________________________________ patch -p0 <<'@@ .' Index: rpm/CHANGES ============================================================================ $ cvs diff -u -r1.3542 -r1.3543 CHANGES --- rpm/CHANGES 2 Jan 2011 20:49:22 -0000 1.3542 +++ rpm/CHANGES 3 Jan 2011 21:20:22 -0000 1.3543 @@ -1,4 +1,5 @@ 5.4.0 -> 5.4.1: + - jbj: rpmns: optimize out strlen() calls on depsolver fast path. - jbj: drd: disable digest/libelf races for now. todo++. - jbj: drd: disable path/tag data races for now. todo++. - jbj: ugid: use the re-entrant user/group lookups. @@ . patch -p0 <<'@@ .' Index: rpm/lib/rpmds.c ============================================================================ $ cvs diff -u -r2.170 -r2.171 rpmds.c --- rpm/lib/rpmds.c 2 Dec 2010 15:00:50 -0000 2.170 +++ rpm/lib/rpmds.c 3 Jan 2011 21:20:23 -0000 2.171 @@ -416,7 +416,6 @@ const char * Name = ds->N[ds->i]; int xx; - memset(ns, 0, sizeof(*ns)); xx = rpmnsParse(Name, ns); /*...@-compdef -userelea...@*/ /* FIX: correct annotations for ds->ns shadow */ @@ . patch -p0 <<'@@ .' Index: rpm/rpmdb/rpmns.c ============================================================================ $ cvs diff -u -r1.15 -r1.16 rpmns.c --- rpm/rpmdb/rpmns.c 1 Jun 2010 22:00:27 -0000 1.15 +++ rpm/rpmdb/rpmns.c 3 Jan 2011 21:20:23 -0000 1.16 @@ -100,120 +100,130 @@ * Dependency probe table. */ /*...@unchecked@*/ /*...@observer@*/ +#define _ENTRY(_s, _type) { #_s, sizeof(#_s)-1, _type } static struct _rpmnsProbes_s { /*...@observer@*/ /*...@relnull@*/ const char * NS; + size_t NSlen; nsType Type; } rpmnsProbes[] = { - { "rpmlib", RPMNS_TYPE_RPMLIB }, - { "config", RPMNS_TYPE_CONFIG }, - { "cpuinfo", RPMNS_TYPE_CPUINFO }, - { "getconf", RPMNS_TYPE_GETCONF }, - { "uname", RPMNS_TYPE_UNAME }, - { "soname", RPMNS_TYPE_SONAME }, - { "user", RPMNS_TYPE_USER }, - { "group", RPMNS_TYPE_GROUP }, - { "mounted", RPMNS_TYPE_MOUNTED }, - { "diskspace", RPMNS_TYPE_DISKSPACE }, - { "digest", RPMNS_TYPE_DIGEST }, - { "gnupg", RPMNS_TYPE_GNUPG }, - { "macro", RPMNS_TYPE_MACRO }, - { "envvar", RPMNS_TYPE_ENVVAR }, - { "running", RPMNS_TYPE_RUNNING }, - { "sanitycheck", RPMNS_TYPE_SANITY }, - { "vcheck", RPMNS_TYPE_VCHECK }, - { "signature", RPMNS_TYPE_SIGNATURE }, - { "verify", RPMNS_TYPE_VERIFY }, - { "exists", RPMNS_TYPE_ACCESS }, - { "executable", RPMNS_TYPE_ACCESS }, - { "readable", RPMNS_TYPE_ACCESS }, - { "writable", RPMNS_TYPE_ACCESS }, - { "RWX", RPMNS_TYPE_ACCESS }, - { "RWx", RPMNS_TYPE_ACCESS }, - { "RW_", RPMNS_TYPE_ACCESS }, - { "RwX", RPMNS_TYPE_ACCESS }, - { "Rwx", RPMNS_TYPE_ACCESS }, - { "Rw_", RPMNS_TYPE_ACCESS }, - { "R_X", RPMNS_TYPE_ACCESS }, - { "R_x", RPMNS_TYPE_ACCESS }, - { "R__", RPMNS_TYPE_ACCESS }, - { "rWX", RPMNS_TYPE_ACCESS }, - { "rWx", RPMNS_TYPE_ACCESS }, - { "rW_", RPMNS_TYPE_ACCESS }, - { "rwX", RPMNS_TYPE_ACCESS }, - { "rwx", RPMNS_TYPE_ACCESS }, - { "rw_", RPMNS_TYPE_ACCESS }, - { "r_X", RPMNS_TYPE_ACCESS }, - { "r_x", RPMNS_TYPE_ACCESS }, - { "r__", RPMNS_TYPE_ACCESS }, - { "_WX", RPMNS_TYPE_ACCESS }, - { "_Wx", RPMNS_TYPE_ACCESS }, - { "_W_", RPMNS_TYPE_ACCESS }, - { "_wX", RPMNS_TYPE_ACCESS }, - { "_wx", RPMNS_TYPE_ACCESS }, - { "_w_", RPMNS_TYPE_ACCESS }, - { "__X", RPMNS_TYPE_ACCESS }, - { "__x", RPMNS_TYPE_ACCESS }, - { "___", RPMNS_TYPE_ACCESS }, - { NULL, 0 } + _ENTRY(rpmlib, RPMNS_TYPE_RPMLIB), + _ENTRY(config, RPMNS_TYPE_CONFIG), + _ENTRY(cpuinfo, RPMNS_TYPE_CPUINFO), + _ENTRY(getconf, RPMNS_TYPE_GETCONF), + _ENTRY(uname, RPMNS_TYPE_UNAME), + _ENTRY(soname, RPMNS_TYPE_SONAME), + _ENTRY(user, RPMNS_TYPE_USER), + _ENTRY(group, RPMNS_TYPE_GROUP), + _ENTRY(mounted, RPMNS_TYPE_MOUNTED), + _ENTRY(diskspace, RPMNS_TYPE_DISKSPACE), + _ENTRY(digest, RPMNS_TYPE_DIGEST), + _ENTRY(gnupg, RPMNS_TYPE_GNUPG), + _ENTRY(macro, RPMNS_TYPE_MACRO), + _ENTRY(envvar, RPMNS_TYPE_ENVVAR), + _ENTRY(running, RPMNS_TYPE_RUNNING), + _ENTRY(sanitycheck, RPMNS_TYPE_SANITY), + _ENTRY(vcheck, RPMNS_TYPE_VCHECK), + _ENTRY(signature, RPMNS_TYPE_SIGNATURE), + _ENTRY(verify, RPMNS_TYPE_VERIFY), + _ENTRY(exists, RPMNS_TYPE_ACCESS), + _ENTRY(executable, RPMNS_TYPE_ACCESS), + _ENTRY(readable, RPMNS_TYPE_ACCESS), + _ENTRY(writable, RPMNS_TYPE_ACCESS), + _ENTRY(RWX, RPMNS_TYPE_ACCESS), + _ENTRY(RWx, RPMNS_TYPE_ACCESS), + _ENTRY(RW_, RPMNS_TYPE_ACCESS), + _ENTRY(RwX, RPMNS_TYPE_ACCESS), + _ENTRY(Rwx, RPMNS_TYPE_ACCESS), + _ENTRY(Rw_, RPMNS_TYPE_ACCESS), + _ENTRY(R_X, RPMNS_TYPE_ACCESS), + _ENTRY(R_x, RPMNS_TYPE_ACCESS), + _ENTRY(R__, RPMNS_TYPE_ACCESS), + _ENTRY(rWX, RPMNS_TYPE_ACCESS), + _ENTRY(rWx, RPMNS_TYPE_ACCESS), + _ENTRY(rW_, RPMNS_TYPE_ACCESS), + _ENTRY(rwX, RPMNS_TYPE_ACCESS), + _ENTRY(rwx, RPMNS_TYPE_ACCESS), + _ENTRY(rw_, RPMNS_TYPE_ACCESS), + _ENTRY(r_X, RPMNS_TYPE_ACCESS), + _ENTRY(r_x, RPMNS_TYPE_ACCESS), + _ENTRY(r__, RPMNS_TYPE_ACCESS), + _ENTRY(_WX, RPMNS_TYPE_ACCESS), + _ENTRY(_Wx, RPMNS_TYPE_ACCESS), + _ENTRY(_W_, RPMNS_TYPE_ACCESS), + _ENTRY(_wX, RPMNS_TYPE_ACCESS), + _ENTRY(_wx, RPMNS_TYPE_ACCESS), + _ENTRY(_w_, RPMNS_TYPE_ACCESS), + _ENTRY(__X, RPMNS_TYPE_ACCESS), + _ENTRY(__x, RPMNS_TYPE_ACCESS), + _ENTRY(___, RPMNS_TYPE_ACCESS), + { NULL, 0, 0 } }; +#undef _ENTRY -nsType rpmnsProbe(const char * str) +nsType rpmnsProbe(const char * s, size_t slen) + /*...@*/ { const struct _rpmnsProbes_s * av; - size_t sn = strlen(str); - size_t nb; - if (sn >= 5 && str[sn-1] == ')') + if (slen == 0) slen = strlen(s); + if (slen >= 5 && s[slen-1] == ')') for (av = rpmnsProbes; av->NS != NULL; av++) { - nb = strlen(av->NS); - if (sn > nb && str[nb] == '(' && !strncmp(str, av->NS, nb)) + size_t NSlen = av->NSlen; + if (slen > NSlen && s[NSlen] == '(' && !strncmp(s, av->NS, NSlen)) return av->Type; } return RPMNS_TYPE_UNKNOWN; } -nsType rpmnsClassify(const char * str) +nsType rpmnsClassify(const char * s, size_t slen) { - const char * s; - nsType Type = RPMNS_TYPE_STRING; + const char * se; + nsType Type; - if (*str == '!') - str++; - if (*str == '/') + if (slen == 0) slen = strlen(s); + if (*s == '!') { + s++; + slen--; + } + if (*s == '/') return RPMNS_TYPE_PATH; - s = str + strlen(str); - if (str[0] == '%' && str[1] == '{' && s[-1] == '}') + se = s + slen; + if (s[0] == '%' && s[1] == '{' && se[-1] == '}') return RPMNS_TYPE_FUNCTION; - if ((s - str) > 3 && s[-3] == '.' && s[-2] == 's' && s[-1] == 'o') + if ((se - s) > 3 && se[-3] == '.' && se[-2] == 's' && se[-1] == 'o') return RPMNS_TYPE_DSO; - Type = rpmnsProbe(str); + Type = rpmnsProbe(s, slen); if (Type != RPMNS_TYPE_UNKNOWN) return Type; - for (s = str; *s != '\0'; s++) { - if (s[0] == '(' || s[strlen(s)-1] == ')') + for (se = s; *se != '\0'; se++) { + if (se[0] == '(' || se[--slen] == ')') return RPMNS_TYPE_NAMESPACE; - if (s[0] == '.' && s[1] == 's' && s[2] == 'o') + if (se[0] == '.' && se[1] == 's' && se[2] == 'o') return RPMNS_TYPE_DSO; - if (s[0] == '.' && xisdigit((int)s[-1]) && xisdigit((int)s[1])) + if (se[0] == '.' && xisdigit((int)se[-1]) && xisdigit((int)se[1])) return RPMNS_TYPE_VERSION; if (_rpmns_N_at_A && _rpmns_N_at_A[0]) { - if (s[0] == _rpmns_N_at_A[0] && rpmnsArch(s+1)) + if (se[0] == _rpmns_N_at_A[0] && rpmnsArch(se+1)) return RPMNS_TYPE_ARCH; } /*...@-globstate@*/ - if (s[0] == '.') + if (se[0] == '.') return RPMNS_TYPE_COMPOUND; } return RPMNS_TYPE_STRING; /*...@=globstate@*/ } -int rpmnsParse(const char * str, rpmns ns) +int rpmnsParse(const char * s, rpmns ns) { - char *t; - ns->str = t = rpmExpand(str, NULL); - ns->Type = rpmnsClassify(ns->str); + char * t = rpmExpand(s, NULL); + size_t tlen = strlen(t); + + ns->Flags = 0; + ns->str = t; + ns->Type = rpmnsClassify(t, tlen); + switch (ns->Type) { case RPMNS_TYPE_ARCH: ns->NS = NULL; @@ . patch -p0 <<'@@ .' Index: rpm/rpmdb/rpmns.h ============================================================================ $ cvs diff -u -r1.5 -r1.6 rpmns.h --- rpm/rpmdb/rpmns.h 21 Dec 2010 05:57:37 -0000 1.5 +++ rpm/rpmdb/rpmns.h 3 Jan 2011 21:20:23 -0000 1.6 @@ -87,23 +87,25 @@ /** \ingroup rpmds * Is string a known probe namespace? - * @param str string + * @param s string + * @param slen string length (0 uses strlen(s)) * @return nsType if known probe, else RPMNS_TYPE_UNKNOWN */ -nsType rpmnsProbe(const char * str) +nsType rpmnsProbe(const char * s, size_t slen) /*...@*/; /** \ingroup rpmds * Classify a string as a dependency type. - * @param str string like "bing(bang).boom" + * @param s string like "bing(bang).boom" + * @param slen string length (0 uses strlen(s)) * @return dependency type */ -nsType rpmnsClassify(const char * str) +nsType rpmnsClassify(const char * s, size_t slen) /*...@*/; /** \ingroup rpmds - * Split NS string into namespace, name and arch components. - * @param str string like "bing(bang).boom" + * Expand and split NS(N).A string into namespace, name and arch components. + * @param s string like "bing(bang).boom" * @retval *ns parse results * @return 0 always */ @@ . ______________________________________________________________________ RPM Package Manager http://rpm5.org CVS Sources Repository rpm-cvs@rpm5.org