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

Reply via email to