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

Reply via email to