RPM Community Forums

Mailing List Message of <rpm-cvs>

[CVS] RPM: rpm/ CHANGES rpm/rpmdb/ header.c

From: Jeff Johnson <jbj@rpm5.org>
Date: Sat 20 Oct 2007 - 21:48:06 CEST
Message-Id: <20071020194806.B216C34845A@rpm5.org>
  RPM Package Manager, CVS Repository
  http://rpm5.org/cvs/
  ____________________________________________________________________________

  Server: rpm5.org                         Name:   Jeff Johnson
  Root:   /v/rpm/cvs                       Email:  jbj@rpm5.org
  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;
   
   /*@unchecked@*/
  -int _tagcache = 0;
  +int _tagcache = 1;
   
   /*@access entryInfo @*/
   /*@access indexEntry @*/
  @@ -2427,6 +2427,79 @@
   }
   
   /**
  + * Mark a tag container with headerGetEntry() freeData.
  + * @param he		tag container
  + */
  +static void rpmtcMark(/*@null@*/ HE_t he)
  +	/*@modifies 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(/*@null@*/ HE_t he)
  +	/*@modifies 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 /*@null@*/ HE_t
  +rpmtcFree(/*@only@*/ HE_t tc, int ntc)
  +	/*@modifies 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 /*@only@*/ HE_t
  +rpmtcNew(int ntc)
  +	/*@*/
  +{
  +    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);
   	    /*@switchbreak@*/ break;
   	case PTOK_NONE:
  -	case PTOK_TAG:
   	case PTOK_STRING:
   	default:
   	    /*@switchbreak@*/ break;
  @@ -2584,58 +2660,6 @@
   }
   
   /**
  - * Clean a tag container.
  - * @param he		tag container
  - */
  -static void rpmtcClean(/*@null@*/ HE_t he)
  -	/*@modifies 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 /*@null@*/ HE_t
  -rpmtcFree(/*@only@*/ HE_t tc, int ntc)
  -	/*@modifies 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 /*@only@*/ HE_t
  -rpmtcNew(int ntc)
  -	/*@*/
  -{
  -    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)
   	/*@modifies 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);
  @@ .
Received on Sat Oct 20 21:48:06 2007
Driven by Jeff Johnson and the RPM project team.
Hosted by OpenPKG and Ralf S. Engelschall.
Powered by FreeBSD and OpenPKG.