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: 24-Mar-2009 16:17:13 Branch: HEAD Handle: 2009032415171201 Modified files: rpm CHANGES rpm/rpmdb header.c librpmdb.vers rpmtag.h Log: - yarn: wire up headerScrub, eliminate header{Link,Unlink}. Summary: Revision Changes Path 1.2864 +1 -0 rpm/CHANGES 1.175 +55 -83 rpm/rpmdb/header.c 1.59 +0 -2 rpm/rpmdb/librpmdb.vers 1.58 +8 -0 rpm/rpmdb/rpmtag.h ____________________________________________________________________________ patch -p0 <<'@@ .' Index: rpm/CHANGES ============================================================================ $ cvs diff -u -r1.2863 -r1.2864 CHANGES --- rpm/CHANGES 23 Mar 2009 17:25:21 -0000 1.2863 +++ rpm/CHANGES 24 Mar 2009 15:17:12 -0000 1.2864 @@ -1,5 +1,6 @@ 5.2a3 -> 5.2a4: + - jbj: yarn: wire up headerScrub, eliminate header{Link,Unlink}. - devzero2000: fix: add autofu AC_CPP_FUNC portability macro in the acinclude.m4 - devzero2000: add autofu AC_CPP_FUNC portability macro - jbj: yarn: wire up rpmteFini, eliminate rpmteFree. @@ . patch -p0 <<'@@ .' Index: rpm/rpmdb/header.c ============================================================================ $ cvs diff -u -r1.174 -r1.175 header.c --- rpm/rpmdb/header.c 20 Mar 2009 18:28:34 -0000 1.174 +++ rpm/rpmdb/header.c 24 Mar 2009 15:17:13 -0000 1.175 @@ -91,23 +91,6 @@ rpmop _hdr_getops = &hdr_getops; /*...@=compmempass@*/ - -/*...@unchecked@*/ /*...@null@*/ -rpmioPool _headerPool; - -static Header headerGetPool(/*...@null@*/ rpmioPool pool) - /*...@modifies pool @*/ -{ - Header h; - - if (_headerPool == NULL) { - _headerPool = rpmioNewPool("h", sizeof(*h), -1, _hdr_debug, - NULL, NULL, NULL); - pool = _headerPool; - } - return (Header) rpmioGetPool(pool, sizeof(*h)); -} - void * headerGetStats(Header h, int opx) { rpmop op = NULL; @@ -119,83 +102,72 @@ return op; } -Header headerLink(Header h) +static void headerScrub(void * _h) /* XXX headerFini already in use */ + /*...@modifies *_h @*/ { -/*...@-nullret@*/ - if (h == NULL) return NULL; -/*...@=nullret@*/ + Header h = _h; - yarnPossess(h->_item.use); -/*...@-modfilesys@*/ -if (_hdr_debug) -fprintf(stderr, "--> h %p ++ %ld at %s:%u\n", h, yarnPeekLock(h->_item.use)+1, __FILE__, __LINE__); -/*...@=modfilesys@*/ - yarnTwist(h->_item.use, BY, 1); + if (h->index != NULL) { + indexEntry entry = h->index; + size_t i; + for (i = 0; i < h->indexUsed; i++, entry++) { + if ((h->flags & HEADERFLAG_ALLOCATED) && ENTRY_IS_REGION(entry)) { + if (entry->length > 0) { + rpmuint32_t * ei = entry->data; + if ((ei - 2) == h->blob) + h->blob = _free(h->blob); + entry->data = NULL; + } + } else if (!ENTRY_IN_REGION(entry)) { + entry->data = _free(entry->data); + } + entry->data = NULL; + } + h->index = _free(h->index); + } + h->origin = _free(h->origin); + h->baseurl = _free(h->baseurl); + h->digest = _free(h->digest); - /*...@-refcounttrans @*/ - return h; - /*...@=refcounttrans @*/ +/*...@-nullstate@*/ + if (_hdr_stats) { + if (_hdr_loadops) /* RPMTS_OP_HDRLOAD */ + (void) rpmswAdd(_hdr_loadops, headerGetStats(h, 18)); + if (_hdr_getops) /* RPMTS_OP_HDRGET */ + (void) rpmswAdd(_hdr_getops, headerGetStats(h, 19)); + } +/*...@=nullstate@*/ } -Header headerUnlink(Header h) +#ifndef BUGGY +Header headerFree(Header h) { - if (h == NULL) return NULL; - yarnPossess(h->_item.use); -/*...@-modfilesys@*/ -if (_hdr_debug) -fprintf(stderr, "--> h %p -- %ld at %s:%u\n", h, yarnPeekLock(h->_item.use), __FILE__, __LINE__); -/*...@=modfilesys@*/ - yarnTwist(h->_item.use, BY, -1); + /* XXX There's a h = headerFree(h) somewhere that depends on + * a NULL being returned from headerFree(). Wire up a NULL + * return from rpmioFreePoolItem() in headerFree() for now. + * Note: the code that depends on headerFree() returning NULL + * is on some lazy deallocation teardown path while trying to exit from + * rpm -qavv that is dereferencing a Header more often than necessary. + */ + (void) rpmioFreePoolItem((rpmioItem)h, __FUNCTION__, __FILE__, __LINE__); return NULL; } +#endif -Header headerFree(Header h) -{ - - if (h == NULL) - return NULL; +/*...@unchecked@*/ /*...@null@*/ +rpmioPool _headerPool; - yarnPossess(h->_item.use); -/*...@-modfilesys@*/ -if (_hdr_debug) -fprintf(stderr, "--> h %p -- %ld at %s:%u\n", h, yarnPeekLock(h->_item.use), __FILE__, __LINE__); -/*...@=modfilesys@*/ - if (yarnPeekLock(h->_item.use) <= 1L) { - if (h->index != NULL) { - indexEntry entry = h->index; - size_t i; - for (i = 0; i < h->indexUsed; i++, entry++) { - if ((h->flags & HEADERFLAG_ALLOCATED) && ENTRY_IS_REGION(entry)) - { - if (entry->length > 0) { - rpmuint32_t * ei = entry->data; - if ((ei - 2) == h->blob) - h->blob = _free(h->blob); - entry->data = NULL; - } - } else if (!ENTRY_IN_REGION(entry)) { - entry->data = _free(entry->data); - } - entry->data = NULL; - } - h->index = _free(h->index); - } - h->origin = _free(h->origin); - h->baseurl = _free(h->baseurl); - h->digest = _free(h->digest); +static Header headerGetPool(/*...@null@*/ rpmioPool pool) + /*...@modifies pool @*/ +{ + Header h; -/*...@-nullstate@*/ - if (_hdr_stats) { - if (_hdr_loadops) /* RPMTS_OP_HDRLOAD */ - (void) rpmswAdd(_hdr_loadops, headerGetStats(h, 18)); - if (_hdr_getops) /* RPMTS_OP_HDRGET */ - (void) rpmswAdd(_hdr_getops, headerGetStats(h, 19)); - } -/*...@=nullstate@*/ - h = (Header) rpmioPutPool((rpmioItem)h); - } else - yarnTwist(h->_item.use, BY, -1); - return NULL; + if (_headerPool == NULL) { + _headerPool = rpmioNewPool("h", sizeof(*h), -1, _hdr_debug, + NULL, NULL, headerScrub); + pool = _headerPool; + } + return (Header) rpmioGetPool(pool, sizeof(*h)); } Header headerNew(void) @@ . patch -p0 <<'@@ .' Index: rpm/rpmdb/librpmdb.vers ============================================================================ $ cvs diff -u -r1.58 -r1.59 librpmdb.vers --- rpm/rpmdb/librpmdb.vers 20 Mar 2009 14:47:12 -0000 1.58 +++ rpm/rpmdb/librpmdb.vers 24 Mar 2009 15:17:13 -0000 1.59 @@ -59,7 +59,6 @@ headerSetStatbuf; headerInit; headerIsEntry; - headerLink; headerLoad; headerMacrosLoad; headerMacrosUnload; @@ -76,7 +75,6 @@ headerSetOrigin; headerSizeof; headerSprintf; - headerUnlink; headerUnload; headerVerifyInfo; hGetColor; @@ . patch -p0 <<'@@ .' Index: rpm/rpmdb/rpmtag.h ============================================================================ $ cvs diff -u -r1.57 -r1.58 rpmtag.h --- rpm/rpmdb/rpmtag.h 29 Dec 2008 22:33:33 -0000 1.57 +++ rpm/rpmdb/rpmtag.h 24 Mar 2009 15:17:13 -0000 1.58 @@ -811,6 +811,8 @@ */ Header headerLink(Header h) /*...@modifies h @*/; +#define headerLink(_h) \ + ((Header)rpmioLinkPoolItem((rpmioItem)(_h), __FUNCTION__, __FILE__, __LINE__)) /** \ingroup header * Dereference a header instance. @@ -820,6 +822,8 @@ /*...@null@*/ Header headerUnlink(/*...@killref@*/ /*...@null@*/ Header h) /*...@modifies h @*/; +#define headerUnlink(_h) \ + ((Header)rpmioUnlinkPoolItem((rpmioItem)(_h), __FUNCTION__, __FILE__, __LINE__)) /** \ingroup header * Dereference a header instance. @@ -829,6 +833,10 @@ /*...@null@*/ Header headerFree(/*...@killref@*/ /*...@null@*/ Header h) /*...@modifies h @*/; +#ifdef NOTYET /* XXX h = headerFree(h) NULL return needs to be found/fixed. */ +#define headerFree(_h) \ + ((Header)rpmioFreePoolItem((rpmioItem)(_h), __FUNCTION__, __FILE__, __LINE__)) +#endif /** \ingroup header * Create new (empty) header instance. @@ . ______________________________________________________________________ RPM Package Manager http://rpm5.org CVS Sources Repository rpm-cvs@rpm5.org