RPM Package Manager, CVS Repository
  http://rpm5.org/cvs/
  ____________________________________________________________________________

  Server: rpm5.org                         Name:   Jeff Johnson
  Root:   /v/rpm/cvs                       Email:  [EMAIL PROTECTED]
  Module: rpm                              Date:   03-May-2008 20:36:05
  Branch: HEAD                             Handle: 2008050318360401

  Modified files:
    rpm                     CHANGES
    rpm/rpmdb               header.c

  Log:
    - jbj: disable the headerLoad speedup's until headerUnload changes are done.
    - jbj: swab integer tag data in headerGet, not headerLoad (measured 6.9% 
rpm-V speedup ymmv).

  Summary:
    Revision    Changes     Path
    1.2316      +2  -0      rpm/CHANGES
    1.157       +115 -89    rpm/rpmdb/header.c
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/CHANGES
  ============================================================================
  $ cvs diff -u -r1.2315 -r1.2316 CHANGES
  --- rpm/CHANGES       2 May 2008 16:13:52 -0000       1.2315
  +++ rpm/CHANGES       3 May 2008 18:36:04 -0000       1.2316
  @@ -1,5 +1,7 @@
   
   5.1.0 -> 5.2a0:
  +    - jbj: disable the headerLoad speedup's until headerUnload changes are 
done.
  +    - jbj: swab integer tag data in headerGet, not headerLoad (measured 6.9% 
rpm-V speedup ymmv).
       - jbj: compute tag store w subtract (measured 26.3% rpm -qa speedup 
ymmv).
       - jbj: initialize ts->PRCO lazily (measured 20.4% rpm -qa speedup ymmv).
       - glen: print error when makeTempPath fails due missing temp dir
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/header.c
  ============================================================================
  $ cvs diff -u -r1.156 -r1.157 header.c
  --- rpm/rpmdb/header.c        2 May 2008 16:13:53 -0000       1.156
  +++ rpm/rpmdb/header.c        3 May 2008 18:36:05 -0000       1.157
  @@ -27,7 +27,11 @@
   /[EMAIL PROTECTED] entryInfo @*/
   /[EMAIL PROTECTED] indexEntry @*/
   
  -int _fastdatalength = 1;
  +/* Compute tag data store size using offsets? */
  +static int _fastdatalength = 0;
  +
  +/* Swab tag data only when accessed through headerGet()? */
  +static int _lazytagswab = 0;
   
   /** \ingroup header
    */
  @@ -359,7 +363,107 @@
   }
   
   /** \ingroup header
  - * Swap uint32_t and uint16_t arrays within header region.
  + * Swab uint64_t/uint32_t/uint16_t arrays within header region.
  + *
  + */
  +static unsigned char * tagSwab(unsigned char * t, const HE_t he, size_t nb)
  +     /[EMAIL PROTECTED] *t @*/
  +{
  +    uint32_t i;
  +
  +    switch (he->t) {
  +    case RPM_UINT64_TYPE:
  +    {        uint32_t * tt = (uint32_t *)t;
  +     for (i = 0; i < he->c; i++) {
  +         uint32_t j = 2 * i;
  +         uint32_t b = (uint32_t) htonl(he->p.ui32p[j]);
  +         tt[j  ] = (uint32_t) htonl(he->p.ui32p[j+1]);
  +         tt[j+1] = b;
  +     }
  +    }   break;
  +    case RPM_UINT32_TYPE:
  +    {        uint32_t * tt = (uint32_t *)t;
  +     for (i = 0; i < he->c; i++)
  +         tt[i] = (uint32_t) htonl(he->p.ui32p[i]);
  +    }   break;
  +    case RPM_UINT16_TYPE:
  +    {        uint16_t * tt = (uint16_t *)t;
  +     for (i = 0; i < he->c; i++)
  +         tt[i] = (uint16_t) htons(he->p.ui16p[i]);
  +    }   break;
  +    default:
  +     if ((void *)t != he->p.ptr && nb)
  +         memcpy(t, he->p.ptr, nb);
  +     t += nb;
  +     break;
  +    }
  +    return t;
  +}
  +
  +/**
  + * Always realloc HE_t memory.
  + * @param he         tag container
  + * @return           1 on success, 0 on failure
  + */
  +static int rpmheRealloc(HE_t he)
  +     /[EMAIL PROTECTED] he @*/
  +{
  +    size_t nb = 0;
  +    int rc = 1;              /* assume success */
  +
  +    switch (he->t) {
  +    default:
  +assert(0);   /* XXX stop unimplemented oversights. */
  +     break;
  +    case RPM_BIN_TYPE:
  +     he->freeData = 1;       /* XXX RPM_BIN_TYPE is malloc'd */
  +     /[EMAIL PROTECTED]@*/
  +    case RPM_UINT8_TYPE:
  +     nb = he->c * sizeof(*he->p.ui8p);
  +     break;
  +    case RPM_UINT16_TYPE:
  +     nb = he->c * sizeof(*he->p.ui16p);
  +     break;
  +    case RPM_UINT32_TYPE:
  +     nb = he->c * sizeof(*he->p.ui32p);
  +     break;
  +    case RPM_UINT64_TYPE:
  +     nb = he->c * sizeof(*he->p.ui64p);
  +     break;
  +    case RPM_STRING_TYPE:
  +     if (he->p.str)
  +         nb = strlen(he->p.str) + 1;
  +     else
  +         rc = 0;
  +     break;
  +    case RPM_I18NSTRING_TYPE:
  +    case RPM_STRING_ARRAY_TYPE:
  +     break;
  +    }
  +
  +    /* Allocate all returned storage (if not already). */
  +    if (he->p.ptr && nb && !he->freeData) {
  +     void * ptr = xmalloc(nb);
  +     if (_lazytagswab) {
  +         if (tagSwab(ptr, he, nb) != NULL)
  +             he->p.ptr = ptr;
  +         else {
  +             ptr = _free(ptr);
  +             rc = 0;
  +         }
  +     } else {
  +         he->p.ptr = memcpy(ptr, he->p.ptr, nb);
  +     }
  +    }
  +
  +    if (rc)
  +     he->freeData = 1;
  +
  +    return rc;
  +}
  +
  +/** \ingroup header
  + * Swab uint64_t/uint32_t/uint16_t arrays within header region.
    *
    * This code is way more twisty than I would like.
    *
  @@ -392,6 +496,7 @@
                int32_t regionid)
        /[EMAIL PROTECTED] *entry, *dataStart @*/
   {
  +    HE_t he = memset(alloca(sizeof(*he)), 0, sizeof(*he));
       rpmTagData p;
       rpmTagData pend;
       unsigned char * tprev = NULL;
  @@ -479,41 +584,15 @@
        }
   
        /* Perform endian conversions */
  -     switch (ntohl(pe->type)) {
  -     case RPM_UINT64_TYPE:
  -     {   uint64_t * it = (uint64_t *)t;
  -         uint32_t b[2];
  -         for (; ie.info.count > 0; ie.info.count--, it += 1) {
  -             if (dataEnd && ((unsigned char *)it) >= dataEnd)
  -                 return 0;
  -             b[1] = (uint32_t) htonl(((uint32_t *)it)[0]);
  -             b[0] = (uint32_t) htonl(((uint32_t *)it)[1]);
  -             if (b[1] != ((uint32_t *)it)[0])
  -                 memcpy(it, b, sizeof(b));
  -         }
  -         t = (unsigned char *) it;
  -     }   /[EMAIL PROTECTED]@*/ break;
  -     case RPM_UINT32_TYPE:
  -     {   uint32_t * it = (uint32_t *)t;
  -         for (; ie.info.count > 0; ie.info.count--, it += 1) {
  -             if (dataEnd && ((unsigned char *)it) >= dataEnd)
  -                 return 0;
  -             *it = (uint32_t) htonl(*it);
  -         }
  -         t = (unsigned char *) it;
  -     }   /[EMAIL PROTECTED]@*/ break;
  -     case RPM_UINT16_TYPE:
  -     {   uint16_t * it = (uint16_t *) t;
  -         for (; ie.info.count > 0; ie.info.count--, it += 1) {
  -             if (dataEnd && ((unsigned char *)it) >= dataEnd)
  -                 return 0;
  -             *it = (uint16_t) htons(*it);
  -         }
  -         t = (unsigned char *) it;
  -     }   /[EMAIL PROTECTED]@*/ break;
  -     default:
  +     if (_lazytagswab)
            t += ie.length;
  -         /[EMAIL PROTECTED]@*/ break;
  +     else {
  +         he->tag = ie.info.tag;
  +         he->t = ie.info.type;
  +         he->p.ptr = t;
  +         he->c = ie.info.count;
  +         if ((t = tagSwab(t, he, ie.length)) == NULL)
  +             return 0;
        }
   
        dl += ie.length;
  @@ -1903,59 +1982,6 @@
   }
   
   /**
  - * Always realloc HE_t memory.
  - * @param he         tag container
  - * @return           1 on success, 0 on failure
  - */
  -static int rpmheRealloc(HE_t he)
  -     /[EMAIL PROTECTED] he @*/
  -{
  -    size_t nb = 0;
  -    int rc = 1;              /* assume success */
  -
  -    switch (he->t) {
  -    default:
  -assert(0);   /* XXX stop unimplemented oversights. */
  -     break;
  -    case RPM_BIN_TYPE:
  -     he->freeData = 1;       /* XXX RPM_BIN_TYPE is malloc'd */
  -     /[EMAIL PROTECTED]@*/
  -    case RPM_UINT8_TYPE:
  -     nb = he->c * sizeof(*he->p.ui8p);
  -     break;
  -    case RPM_UINT16_TYPE:
  -     nb = he->c * sizeof(*he->p.ui16p);
  -     break;
  -    case RPM_UINT32_TYPE:
  -     nb = he->c * sizeof(*he->p.ui32p);
  -     break;
  -    case RPM_UINT64_TYPE:
  -     nb = he->c * sizeof(*he->p.ui64p);
  -     break;
  -    case RPM_STRING_TYPE:
  -     if (he->p.str)
  -         nb = strlen(he->p.str) + 1;
  -     else
  -         rc = 0;
  -     break;
  -    case RPM_I18NSTRING_TYPE:
  -    case RPM_STRING_ARRAY_TYPE:
  -     break;
  -    }
  -
  -    /* Allocate all returned storage (if not already). */
  -    if (he->p.ptr && nb && !he->freeData) {
  -     void * ptr = memcpy(xmalloc(nb), he->p.ptr, nb);
  -     he->p.ptr = ptr;
  -    }
  -
  -    if (rc)
  -     he->freeData = 1;
  -
  -    return rc;
  -}
  -
  -/**
    * Header tag iterator data structure.
    */
   struct headerIterator_s {
  @@ .
______________________________________________________________________
RPM Package Manager                                    http://rpm5.org
CVS Sources Repository                                [email protected]

Reply via email to