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:49:20 Branch: HEAD Handle: 2009031919491901 Modified files: rpm CHANGES rpm/lib poptALL.c rpm/rpmdb librpmdb.vers rpmdb.c rpmdb.h Log: - yarn: convert rpmdb refcount to usage mutex. Summary: Revision Changes Path 1.2849 +1 -0 rpm/CHANGES 2.114 +3 -0 rpm/lib/poptALL.c 1.57 +1 -2 rpm/rpmdb/librpmdb.vers 1.279 +71 -68 rpm/rpmdb/rpmdb.c 1.84 +11 -20 rpm/rpmdb/rpmdb.h ____________________________________________________________________________ patch -p0 <<'@@ .' Index: rpm/CHANGES ============================================================================ $ cvs diff -u -r1.2848 -r1.2849 CHANGES --- rpm/CHANGES 19 Mar 2009 18:22:03 -0000 1.2848 +++ rpm/CHANGES 19 Mar 2009 19:49:19 -0000 1.2849 @@ -1,5 +1,6 @@ 5.2a3 -> 5.2a4: + - 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.113 -r2.114 poptALL.c --- rpm/lib/poptALL.c 19 Mar 2009 18:22:03 -0000 2.113 +++ rpm/lib/poptALL.c 19 Mar 2009 19:49:19 -0000 2.114 @@ -465,6 +465,7 @@ /*...@modifies keyids @*/ { extern rpmioPool _headerPool; + extern rpmioPool _rpmdbPool; _rpmgiPool = rpmioFreePool(_rpmgiPool); @@ -478,6 +479,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.56 -r1.57 librpmdb.vers --- rpm/rpmdb/librpmdb.vers 17 Mar 2009 23:59:04 -0000 1.56 +++ rpm/rpmdb/librpmdb.vers 19 Mar 2009 19:49:20 -0000 1.57 @@ -87,6 +87,7 @@ rpmAddSignature; rpmCheckPassPhrase; rpmDatabasePoptTable; + _rpmdbPool; rpmdbAdd; rpmdbAppendIterator; rpmDBArgs; @@ -185,8 +186,6 @@ tagType; tagTypeValidate; tagValue; - XrpmdbLink; - XrpmdbUnlink; local: *; }; @@ . patch -p0 <<'@@ .' Index: rpm/rpmdb/rpmdb.c ============================================================================ $ cvs diff -u -r1.278 -r1.279 rpmdb.c --- rpm/rpmdb/rpmdb.c 19 Feb 2009 15:27:07 -0000 1.278 +++ rpm/rpmdb/rpmdb.c 19 Mar 2009 19:49:20 -0000 1.279 @@ -67,7 +67,6 @@ /*...@unchecked@*/ static int _db_filter_dups = 0; - /* Use a path uniquifier in the upper 16 bits of tagNum? */ /* XXX Note: one cannot just choose a value, rpmdb tagNum's need fixing too */ #define _DB_TAGGED_FILE_INDICES 1 @@ -930,12 +929,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; @@ -1015,6 +1029,7 @@ /*...@globals rpmdbRock @*/ /*...@modifies rpmdbRock @*/ { + static const char msg[] = "rpmdbClose"; rpmdb * prev, next; size_t dbix; int rc = 0; @@ -1022,55 +1037,59 @@ if (db == NULL) return rc; - (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) - return rc; + 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@*/ - if (rpmdbRock == NULL && rpmmiRock == NULL) { - /* Last close uninstalls special signal handling. */ - (void) rpmsqEnable(-SIGHUP, NULL); - (void) rpmsqEnable(-SIGINT, NULL); - (void) rpmsqEnable(-SIGTERM, NULL); - (void) rpmsqEnable(-SIGQUIT, NULL); - (void) rpmsqEnable(-SIGPIPE, NULL); - /* Pending signals strike here. */ - (void) rpmdbCheckSignals(); - } + if (rpmdbRock == NULL && rpmmiRock == NULL) { + /* Last close uninstalls special signal handling. */ + (void) rpmsqEnable(-SIGHUP, NULL); + (void) rpmsqEnable(-SIGINT, NULL); + (void) rpmsqEnable(-SIGTERM, NULL); + (void) rpmsqEnable(-SIGQUIT, NULL); + (void) rpmsqEnable(-SIGPIPE, NULL); + /* Pending signals strike here. */ + (void) rpmdbCheckSignals(); + } - /*...@-refcounttrans@*/ db = _free(db); /*...@=refcounttrans@*/ /*...@=usereleased@*/ + db = (rpmdb)rpmioPutPool((rpmioItem)db); + } else + yarnTwist(db->use, BY, -1); return rc; } @@ -1156,7 +1175,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; @@ -1170,9 +1189,14 @@ oneshot = 1; } - /*...@-assignexpose@*/ - *db = dbTemplate; /* structure assignment */ - /*...@=assignexpose@*/ + { yarnLock use = db->use; + void * pool = db->pool; + /*...@-assignexpose@*/ + *db = dbTemplate; /* structure assignment */ + /*...@=assignexpose@*/ + db->pool = pool; + db->use = use; + } db->_dbi = NULL; @@ -1189,7 +1213,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@*/ } @@ -1199,7 +1223,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@*/ @@ -1313,26 +1336,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.83 -r1.84 rpmdb.h --- rpm/rpmdb/rpmdb.h 11 Dec 2008 23:31:57 -0000 1.83 +++ rpm/rpmdb/rpmdb.h 19 Mar 2009 19:49:20 -0000 1.84 @@ -53,7 +53,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"). @@ -419,6 +421,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@*/ @@ -466,8 +472,6 @@ struct rpmop_s db_putops; /*!< dbiPut statistics. */ struct rpmop_s db_delops; /*!< dbiDel statistics. */ -/*...@refs@*/ - int nrefs; /*!< Reference count. */ }; #endif /* defined(_RPMDB_INTERNAL) */ @@ -874,15 +878,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. @@ -890,17 +887,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