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:   20-Oct-2007 21:48:06
  Branch: HEAD                             Handle: 2007102020480600

  Modified files:
    rpm                     CHANGES
    rpm/rpmdb               header.c

  Log:
    - jbj: enable Plan B tag data caching.

  Summary:
    Revision    Changes     Path
    1.1745      +1  -0      rpm/CHANGES
    1.105       +85 -84     rpm/rpmdb/header.c
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/CHANGES
  ============================================================================
  $ cvs diff -u -r1.1744 -r1.1745 CHANGES
  --- rpm/CHANGES       20 Oct 2007 18:52:34 -0000      1.1744
  +++ rpm/CHANGES       20 Oct 2007 19:48:06 -0000      1.1745
  @@ -1,4 +1,5 @@
   4.5 -> 5.0:
  +    - jbj: enable Plan B tag data caching.
       - jbj: grr, Plan B: cache w sprintfTag, not sprintfToken.
       - jbj: use tag data cache.
       - jbj: add tag data cache.
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/header.c
  ============================================================================
  $ cvs diff -u -r1.104 -r1.105 header.c
  --- rpm/rpmdb/header.c        20 Oct 2007 18:52:34 -0000      1.104
  +++ rpm/rpmdb/header.c        20 Oct 2007 19:48:06 -0000      1.105
  @@ -30,7 +30,7 @@
   int _newmagic = 0;
   
   /[EMAIL PROTECTED]@*/
  -int _tagcache = 0;
  +int _tagcache = 1;
   
   /[EMAIL PROTECTED] entryInfo @*/
   /[EMAIL PROTECTED] indexEntry @*/
  @@ -2427,6 +2427,79 @@
   }
   
   /**
  + * Mark a tag container with headerGetEntry() freeData.
  + * @param he         tag container
  + */
  +static void rpmtcMark(/[EMAIL PROTECTED]@*/ HE_t he)
  +     /[EMAIL PROTECTED] he @*/
  +{
  +    /* Set he->freeData as appropriate for headerGetEntry() . */
  +    if (he)
  +    switch (he->t) {
  +    default:
  +     he->freeData = 0;
  +     break;
  +    case RPM_STRING_ARRAY_TYPE:
  +    case RPM_BIN_TYPE:
  +     he->freeData = 1;
  +     break;
  +    }
  +    return;
  +}
  +
  +/**
  + * Clean a tag container, free'ing attached malloc's..
  + * @param he         tag container
  + */
  +static void rpmtcClean(/[EMAIL PROTECTED]@*/ HE_t he)
  +     /[EMAIL PROTECTED] he @*/
  +{
  +    if (he) {
  +     if (he->freeData) {
  +if (_jbj)
  +fprintf(stderr, " ZAP: %p tag %s(%d)\t%d %p[%d:%d] free %d avail %d\n", he, 
tagName(he->tag), he->tag, he->t, he->p.ptr, he->ix, he->c, he->freeData, 
he->avail);
  +         he->p.ptr = _free(he->p.ptr);
  +     }
  +     memset(he, 0, sizeof(*he));
  +    }
  +    return;
  +}
  +
  +#ifdef       NOTYET
  +/**
  + * Destroy tag data cache.
  + * @param tc         tag data cache
  + * @param ntc                no. of elements
  + * @return           NULL always
  + */
  +static /[EMAIL PROTECTED]@*/ HE_t
  +rpmtcFree(/[EMAIL PROTECTED]@*/ HE_t tc, int ntc)
  +     /[EMAIL PROTECTED] ec @*/
  +{
  +    int i;
  +
  +    if (tc != NULL)
  +    for (i = 0; i < ntc; i++)
  +     rpmtcClean(tc + i);
  +    tc = _free(tc);
  +    return NULL;
  +}
  +
  +/**
  + * Create tag data cache.
  + * @param ntc                no. of elements
  + * @return           new tag data cache
  + */
  +static /[EMAIL PROTECTED]@*/ HE_t
  +rpmtcNew(int ntc)
  +     /[EMAIL PROTECTED]/
  +{
  +    HE_t ec = xcalloc(ntc+1, sizeof(*ec));
  +    return ec;
  +}
  +#endif
  +
  +/**
    * Destroy headerSprintf format array.
    * @param format     sprintf format array
    * @param num                number of elements
  @@ -2442,6 +2515,9 @@
   
       for (i = 0; i < num; i++) {
        switch (format[i].type) {
  +     case PTOK_TAG:
  +         rpmtcClean(&format[i].u.tag.he);
  +         break;
        case PTOK_ARRAY:
            format[i].u.array.format =
                freeFormat(format[i].u.array.format,
  @@ -2454,9 +2530,9 @@
            format[i].u.cond.elseFormat =
                freeFormat(format[i].u.cond.elseFormat, 
                        format[i].u.cond.numElseTokens);
  +         rpmtcClean(&format[i].u.cond.tag.he);
            /[EMAIL PROTECTED]@*/ break;
        case PTOK_NONE:
  -     case PTOK_TAG:
        case PTOK_STRING:
        default:
            /[EMAIL PROTECTED]@*/ break;
  @@ -2584,58 +2660,6 @@
   }
   
   /**
  - * Clean a tag container.
  - * @param he         tag container
  - */
  -static void rpmtcClean(/[EMAIL PROTECTED]@*/ HE_t he)
  -     /[EMAIL PROTECTED] he @*/
  -{
  -    if (he) {
  -     if (he->freeData) {
  -if (_jbj)
  -fprintf(stderr, " ZAP: %p tag %s(%d)\t%d %p[%d:%d] free %d avail %d\n", he, 
tagName(he->tag), he->tag, he->t, he->p.ptr, he->ix, he->c, he->freeData, 
he->avail);
  -         he->p.ptr = _free(he->p.ptr);
  -     }
  -     memset(he, 0, sizeof(*he));
  -    }
  -    return;
  -}
  -
  -#ifdef       NOTYET
  -/**
  - * Destroy tag data cache.
  - * @param tc         tag data cache
  - * @param ntc                no. of elements
  - * @return           NULL always
  - */
  -static /[EMAIL PROTECTED]@*/ HE_t
  -rpmtcFree(/[EMAIL PROTECTED]@*/ HE_t tc, int ntc)
  -     /[EMAIL PROTECTED] ec @*/
  -{
  -    int i;
  -
  -    if (tc != NULL)
  -    for (i = 0; i < ntc; i++)
  -     rpmtcClean(tc + i);
  -    tc = _free(tc);
  -    return NULL;
  -}
  -
  -/**
  - * Create tag data cache.
  - * @param ntc                no. of elements
  - * @return           new tag data cache
  - */
  -static /[EMAIL PROTECTED]@*/ HE_t
  -rpmtcNew(int ntc)
  -     /[EMAIL PROTECTED]/
  -{
  -    HE_t ec = xcalloc(ntc+1, sizeof(*ec));
  -    return ec;
  -}
  -#endif
  -
  -/**
    */
   typedef struct headerSprintfArgs_s {
       Header h;
  @@ -2709,26 +2733,15 @@
        if (hsa->hi == NULL) {
            hsa->i++;
        } else {
  -         HE_t he = memset(alloca(sizeof(*he)), 0, sizeof(*he));
  -         if (!headerNextIterator(hsa->hi, &he->tag, &he->t, NULL, &he->c))
  +         HE_t he = &tag->he;
  +         rpmtcClean(he);
  +         if (!headerNextIterator(hsa->hi, &he->tag, &he->t, &he->p, &he->c))
            {
                tag->tagno = 0;
                return NULL;
            }
            tag->tagno = he->tag;
  -#ifdef       NOTYET
  -         /* Set he->freeData as appropriate for headerGetEntry() . */
  -         switch (he->t) {
  -         default:
  -             break;
  -         case RPM_STRING_ARRAY_TYPE:
  -         case RPM_OPENPGP_TYPE:
  -         case RPM_ASN1_TYPE:
  -         case RPM_BIN_TYPE:
  -             he->freeData = 1;
  -             break;
  -         }
  -#endif
  +         rpmtcMark(he);
            he->avail = 1;
   if (_jbj)
   fprintf(stderr, " NEW: %p tag %s(%d)\t%d %p[%d:%d] free %d avail %d\n", he, 
tagName(he->tag), he->tag, he->t, he->p.ptr, he->ix, he->c, he->freeData, 
he->avail);
  @@ -3569,7 +3582,7 @@
   static char * formatValue(headerSprintfArgs hsa, sprintfTag tag, int element)
        /[EMAIL PROTECTED] hsa @*/
   {
  -    HE_t he = memset(alloca(sizeof(*he)), 0, sizeof(*he));
  +    HE_t he = &tag->he;
       char * val = NULL;
       size_t need = 0;
       char * t, * te;
  @@ -3588,25 +3601,13 @@
        }
       } else
       if (!he->avail) {
  -     /* XXX calling headerGetEntry for every element in array is pathetic. */
  -     he->tag = tag->tagno;
  +     he->tag = tag->tagno;   /* XXX necessary? */
        if (!headerGetEntry(hsa->h, he->tag, &he->t, &he->p, &he->c)) {
            he->c = 1;
            he->t = RPM_STRING_TYPE;    
            he->p.str = "(none)";
        }
  -
  -     /* Set he->freeData as appropriate for headerGetEntry() . */
  -     switch (he->t) {
  -     default:
  -         break;
  -     case RPM_STRING_ARRAY_TYPE:
  -     case RPM_OPENPGP_TYPE:
  -     case RPM_ASN1_TYPE:
  -     case RPM_BIN_TYPE:
  -         he->freeData = 1;
  -         break;
  -     }
  +     rpmtcMark(he);
        he->avail = 1;
   if (_jbj)
   fprintf(stderr, " NEW: %p tag %s(%d)\t%d %p[%d:%d] free %d avail %d\n", he, 
tagName(he->tag), he->tag, he->t, he->p.ptr, he->ix, he->c, he->freeData, 
he->avail);
  @@ .
______________________________________________________________________
RPM Package Manager                                    http://rpm5.org
CVS Sources Repository                                [email protected]

Reply via email to