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: 19-Mar-2009 20:50:09 Branch: rpm-5_1 Handle: 2009031919500801 Modified files: (Branch: rpm-5_1) rpm CHANGES rpm/lib poptALL.c rpm/rpmdb librpmdb.vers rpmdb.c rpmdb.h Log: - jbj: yarn: convert rpmdb refcount to usage mutex. Summary: Revision Changes Path 1.2288.2.221+1 -0 rpm/CHANGES 2.90.2.14 +3 -0 rpm/lib/poptALL.c 1.43.2.8 +1 -2 rpm/rpmdb/librpmdb.vers 1.246.2.5 +59 -55 rpm/rpmdb/rpmdb.c 1.73.2.4 +11 -20 rpm/rpmdb/rpmdb.h ____________________________________________________________________________ patch -p0 <<'@@ .' Index: rpm/CHANGES ============================================================================ $ cvs diff -u -r1.2288.2.220 -r1.2288.2.221 CHANGES --- rpm/CHANGES 19 Mar 2009 18:22:29 -0000 1.2288.2.220 +++ rpm/CHANGES 19 Mar 2009 19:50:08 -0000 1.2288.2.221 @@ -1,4 +1,5 @@ 5.1.7 -> 5.1.8: + - jbj: yarn: convert rpmdb refcount to usage mutex. - jbj: yarn: convert psm refcount to usage mutex. - jbj: yarn: convert rpmxar refcount to usage mutex. - jbj: yarn: convert pgpDig refcount to usage mutex (avoid recurse deadlock). @@ . patch -p0 <<'@@ .' Index: rpm/lib/poptALL.c ============================================================================ $ cvs diff -u -r2.90.2.13 -r2.90.2.14 poptALL.c --- rpm/lib/poptALL.c 19 Mar 2009 18:22:30 -0000 2.90.2.13 +++ rpm/lib/poptALL.c 19 Mar 2009 19:50:09 -0000 2.90.2.14 @@ -451,6 +451,7 @@ /*...@modifies keyids @*/ { extern rpmioPool _headerPool; + extern rpmioPool _rpmdbPool; _rpmgiPool = rpmioFreePool(_rpmgiPool); @@ -464,6 +465,8 @@ _rpmsxPool = rpmioFreePool(_rpmsxPool); _rpmdsPool = rpmioFreePool(_rpmdsPool); _rpmfiPool = rpmioFreePool(_rpmfiPool); + + _rpmdbPool = rpmioFreePool(_rpmdbPool); _headerPool = rpmioFreePool(_headerPool); /* XXX this should be done in the rpmioClean() wrapper. */ @@ . patch -p0 <<'@@ .' Index: rpm/rpmdb/librpmdb.vers ============================================================================ $ cvs diff -u -r1.43.2.7 -r1.43.2.8 librpmdb.vers --- rpm/rpmdb/librpmdb.vers 18 Mar 2009 00:00:05 -0000 1.43.2.7 +++ rpm/rpmdb/librpmdb.vers 19 Mar 2009 19:50:09 -0000 1.43.2.8 @@ -86,6 +86,7 @@ rpmAddSignature; rpmCheckPassPhrase; rpmDatabasePoptTable; + _rpmdbPool; rpmdbAdd; rpmdbAppendIterator; rpmDBArgs; @@ -171,8 +172,6 @@ tagType; tagTypeValidate; tagValue; - XrpmdbLink; - XrpmdbUnlink; local: *; }; @@ . patch -p0 <<'@@ .' Index: rpm/rpmdb/rpmdb.c ============================================================================ $ cvs diff -u -r1.246.2.4 -r1.246.2.5 rpmdb.c --- rpm/rpmdb/rpmdb.c 15 Oct 2008 19:53:30 -0000 1.246.2.4 +++ rpm/rpmdb/rpmdb.c 19 Mar 2009 19:50:09 -0000 1.246.2.5 @@ -926,12 +926,27 @@ /*...@-fullinitblock@*/ /*...@observer@*/ /*...@unchecked@*/ -static struct rpmdb_s dbTemplate = { +static struct rpmdb_s dbTemplate = { NULL, NULL, _DB_ROOT, _DB_HOME, _DB_FLAGS, _DB_MODE, _DB_PERMS, _DB_MAJOR, _DB_ERRPFX }; /*...@=fullinitblock@*/ +/*...@unchecked@*/ /*...@null@*/ +rpmioPool _rpmdbPool; + +static rpmdb rpmdbGetPool(/*...@null@*/ rpmioPool pool) + /*...@modifies pool @*/ +{ + rpmdb db; + + if (_rpmdbPool == NULL) { + _rpmdbPool = rpmioNewPool("db", sizeof(*db), -1, _rpmdb_debug); + pool = _rpmdbPool; + } + return (rpmdb) rpmioGetPool(pool, sizeof(*db)); +} + int rpmdbOpenAll(rpmdb db) { size_t dbix; @@ -1011,6 +1026,7 @@ /*...@globals rpmdbRock @*/ /*...@modifies rpmdbRock @*/ { + static const char msg[] = "rpmdbClose"; rpmdb * prev, next; size_t dbix; int rc = 0; @@ -1018,44 +1034,48 @@ if (db == NULL) goto exit; - (void) rpmdbUnlink(db, "rpmdbClose"); + yarnPossess(db->use); +/*...@-modfilesys@*/ +if (_rpmdb_debug) +fprintf(stderr, "--> db %p -- %ld %s at %s:%u\n", db, yarnPeekLock(db->use), msg, __FILE__, __LINE__); /*...@-usereleased@*/ - if (db->nrefs > 0) - goto exit; + if (yarnPeekLock(db->use) <= 1L) { - if (db->_dbi) - for (dbix = db->db_ndbi; dbix;) { - int xx; - dbix--; - if (db->_dbi[dbix] == NULL) - continue; - /*...@-unqualifiedtrans@*/ /* FIX: double indirection. */ - xx = dbiClose(db->_dbi[dbix], 0); - if (xx && rc == 0) rc = xx; - db->_dbi[dbix] = NULL; - /*...@=unqualifiedtrans@*/ - } - db->db_errpfx = _free(db->db_errpfx); - db->db_root = _free(db->db_root); - db->db_home = _free(db->db_home); - db->db_bits = PBM_FREE(db->db_bits); - db->db_tags = tagStoreFree(db->db_tags, db->db_ndbi); - db->_dbi = _free(db->_dbi); - db->db_ndbi = 0; + if (db->_dbi) + for (dbix = db->db_ndbi; dbix;) { + int xx; + dbix--; + if (db->_dbi[dbix] == NULL) + continue; + /*...@-unqualifiedtrans@*/ /* FIX: double indirection. */ + xx = dbiClose(db->_dbi[dbix], 0); + if (xx && rc == 0) rc = xx; + db->_dbi[dbix] = NULL; + /*...@=unqualifiedtrans@*/ + } + db->db_errpfx = _free(db->db_errpfx); + db->db_root = _free(db->db_root); + db->db_home = _free(db->db_home); + db->db_bits = PBM_FREE(db->db_bits); + db->db_tags = tagStoreFree(db->db_tags, db->db_ndbi); + db->_dbi = _free(db->_dbi); + db->db_ndbi = 0; /*...@-newreftrans@*/ - prev = &rpmdbRock; - while ((next = *prev) != NULL && next != db) - prev = &next->db_next; - if (next) { -/*...@i@*/ *prev = next->db_next; - next->db_next = NULL; - } + prev = &rpmdbRock; + while ((next = *prev) != NULL && next != db) + prev = &next->db_next; + if (next) { +/*...@i@*/ *prev = next->db_next; + next->db_next = NULL; + } /*...@=newreftrans@*/ - /*...@-refcounttrans@*/ db = _free(db); /*...@=refcounttrans@*/ - /*...@=usereleased@*/ + /*...@=usereleased@*/ + db = (rpmdb)rpmioPutPool((rpmioItem)db); + } else + yarnTwist(db->use, BY, -1); exit: (void) rpmsqEnable(-SIGHUP, NULL); @@ -1147,7 +1167,7 @@ /*...@globals _db_filter_dups, rpmGlobalMacroContext, h_errno @*/ /*...@modifies _db_filter_dups, rpmGlobalMacroContext @*/ { - rpmdb db = xcalloc(sizeof(*db), 1); + rpmdb db = rpmdbGetPool(_rpmdbPool); const char * epfx = _DB_ERRPFX; static int oneshot = 0; @@ -1161,9 +1181,14 @@ oneshot = 1; } + { yarnLock use = db->use; + void * pool = db->pool; /*...@-assignexpose@*/ *db = dbTemplate; /* structure assignment */ /*...@=assignexpose@*/ + db->pool = pool; + db->use = use; + } db->_dbi = NULL; @@ -1180,7 +1205,7 @@ rpmlog(RPMLOG_ERR, _("no dbpath has been set\n")); db->db_root = _free(db->db_root); db->db_home = _free(db->db_home); - db = _free(db); + db = (rpmdb) rpmioPutPool((rpmioItem)db); /*...@-globstate@*/ return NULL; /*...@=globstate@*/ } @@ -1190,7 +1215,6 @@ db->db_filter_dups = _db_filter_dups; dbiTagsInit(&db->db_tags, &db->db_ndbi); db->_dbi = xcalloc(db->db_ndbi, sizeof(*db->_dbi)); - db->nrefs = 0; /*...@-globstate@*/ return rpmdbLink(db, "rpmdbCreate"); /*...@=globstate@*/ @@ -1298,26 +1322,6 @@ } /*...@=exportheader@*/ -rpmdb XrpmdbUnlink(rpmdb db, const char * msg, const char * fn, unsigned ln) -{ -/*...@-modfilesys@*/ -if (_rpmdb_debug) -fprintf(stderr, "--> db %p -- %d %s at %s:%u\n", db, db->nrefs, msg, fn, ln); -/*...@=modfilesys@*/ - db->nrefs--; - return NULL; -} - -rpmdb XrpmdbLink(rpmdb db, const char * msg, const char * fn, unsigned ln) -{ - db->nrefs++; -/*...@-modfilesys@*/ -if (_rpmdb_debug) -fprintf(stderr, "--> db %p ++ %d %s at %s:%u\n", db, db->nrefs, msg, fn, ln); -/*...@=modfilesys@*/ - /*...@-refcounttrans@*/ return db; /*...@=refcounttrans@*/ -} - /* XXX python/rpmmodule.c */ int rpmdbOpen (const char * prefix, rpmdb *dbp, int mode, int perms) { @@ . patch -p0 <<'@@ .' Index: rpm/rpmdb/rpmdb.h ============================================================================ $ cvs diff -u -r1.73.2.3 -r1.73.2.4 rpmdb.h --- rpm/rpmdb/rpmdb.h 15 Oct 2008 19:53:30 -0000 1.73.2.3 +++ rpm/rpmdb/rpmdb.h 19 Mar 2009 19:50:09 -0000 1.73.2.4 @@ -49,7 +49,9 @@ typedef /*...@abstract@*/ struct _dbiIndex * dbiIndex; #if defined(_RPMDB_INTERNAL) +#include <rpmio.h> #include <rpmsw.h> + #if !defined(SWIG) /* XXX inline dbiFoo() need */ /** \ingroup dbi * A single item from an index database (i.e. the "data returned"). @@ -415,6 +417,10 @@ * Describes the collection of index databases used by rpm. */ struct rpmdb_s { + yarnLock use; /*!< use count -- return to pool when zero */ +/*...@shared@*/ /*...@null@*/ + void *pool; /*!< pool (or NULL if malloc'd) */ + /*...@owned@*/ /*...@relnull@*/ const char * db_root; /*!< rpmdb path prefix */ /*...@owned@*/ @@ -462,8 +468,6 @@ struct rpmop_s db_putops; /*!< dbiPut statistics. */ struct rpmop_s db_delops; /*!< dbiDel statistics. */ -/*...@refs@*/ - int nrefs; /*!< Reference count. */ }; #endif /* defined(_RPMDB_INTERNAL) */ @@ -870,15 +874,8 @@ /*...@unused@*/ /*...@null@*/ rpmdb rpmdbUnlink (/*...@killref@*/ /*...@only@*/ rpmdb db, const char * msg) /*...@modifies db @*/; - -/** @todo Remove debugging entry from the ABI. */ -/*...@-exportlocal@*/ -/*...@null@*/ -rpmdb XrpmdbUnlink (/*...@killref@*/ /*...@only@*/ rpmdb db, const char * msg, - const char * fn, unsigned ln) - /*...@modifies db @*/; -/*...@=exportlocal@*/ -#define rpmdbUnlink(_db, _msg) XrpmdbUnlink(_db, _msg, __FILE__, __LINE__) +#define rpmdbUnlink(_db, _msg) \ + ((rpmdb)rpmioUnlinkPoolItem((rpmioItem)(_db), _msg, __FILE__, __LINE__)) /** \ingroup rpmdb * Reference a database instance. @@ -886,17 +883,11 @@ * @param msg * @return new rpm database reference */ -/*...@unused@*/ +/*...@unused@*/ /*...@newref@*/ rpmdb rpmdbLink (rpmdb db, const char * msg) /*...@modifies db @*/; - -/** @todo Remove debugging entry from the ABI. */ -/*...@-exportlocal@*/ -rpmdb XrpmdbLink (rpmdb db, const char * msg, - const char * fn, unsigned ln) - /*...@modifies db @*/; -/*...@=exportlocal@*/ -#define rpmdbLink(_db, _msg) XrpmdbLink(_db, _msg, __FILE__, __LINE__) +#define rpmdbLink(_db, _msg) \ + ((void *)rpmioLinkPoolItem((rpmioItem)(_db), _msg, __FILE__, __LINE__)) /** @todo document rpmdbNew */ @@ . ______________________________________________________________________ RPM Package Manager http://rpm5.org CVS Sources Repository rpm-cvs@rpm5.org