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:   17-Mar-2009 14:27:47
  Branch: HEAD                             Handle: 2009031713274600

  Modified files:
    rpm/lib                 rpmds.c rpmds.h

  Log:
    - yarn: convert rpmds refcounts to usage mutexes.

  Summary:
    Revision    Changes     Path
    2.129       +41 -28     rpm/lib/rpmds.c
    2.75        +1  -2      rpm/lib/rpmds.h
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/lib/rpmds.c
  ============================================================================
  $ cvs diff -u -r2.128 -r2.129 rpmds.c
  --- rpm/lib/rpmds.c   13 Mar 2009 18:35:53 -0000      2.128
  +++ rpm/lib/rpmds.c   17 Mar 2009 13:27:46 -0000      2.129
  @@ -125,23 +125,24 @@
   rpmds XrpmdsUnlink(rpmds ds, const char * msg, const char * fn, unsigned ln)
   {
       if (ds == NULL) return NULL;
  +    yarnPossess(ds->use);
   /*...@-modfilesys@*/
   if (_rpmds_debug && msg != NULL)
  -fprintf(stderr, "--> ds %p -- %d %s at %s:%u\n", ds, ds->nrefs, msg, fn, ln);
  +fprintf(stderr, "--> ds %p -- %ld %s at %s:%u\n", ds, yarnPeekLock(ds->use), 
msg, fn, ln);
   /*...@=modfilesys@*/
  -    ds->nrefs--;
  +    yarnTwist(ds->use, BY, -1);
       return NULL;
   }
   
   rpmds XrpmdsLink(rpmds ds, const char * msg, const char * fn, unsigned ln)
   {
       if (ds == NULL) return NULL;
  -    ds->nrefs++;
  -
  +    yarnPossess(ds->use);
   /*...@-modfilesys@*/
   if (_rpmds_debug && msg != NULL)
  -fprintf(stderr, "--> ds %p ++ %d %s at %s:%u\n", ds, ds->nrefs, msg, fn, ln);
  +fprintf(stderr, "--> ds %p ++ %ld %s at %s:%u\n", ds, 
yarnPeekLock(ds->use)+1, msg, fn, ln);
   /*...@=modfilesys@*/
  +    yarnTwist(ds->use, BY, 1);
   
       /*...@-refcounttrans@*/ return ds; /*...@=refcounttrans@*/
   }
  @@ -185,36 +186,44 @@
       if (ds == NULL)
        return NULL;
   
  -    if (ds->nrefs > 1)
  -     return rpmdsUnlink(ds, ds->Type);
  +    yarnPossess(ds->use);
  +/*...@-modfilesys@*/
  +if (_rpmds_debug)
  +fprintf(stderr, "--> ds %p -- %ld %s at %s:%u\n", ds, yarnPeekLock(ds->use), 
ds->Type, __FILE__, __LINE__);
  +/*...@=modfilesys@*/
  +    if (yarnPeekLock(ds->use) <= 1) {
  +     yarnLock use = ds->use;
   
   /*...@-modfilesys@*/
   if (_rpmds_debug < 0)
   fprintf(stderr, "*** ds %p\t%s[%d]\n", ds, ds->Type, ds->Count);
   /*...@=modfilesys@*/
   
  -    if (ds->Count > 0) {
  -     ds->N = _free(ds->N);
  -     ds->EVR = _free(ds->EVR);
  -     ds->Flags = _free(ds->Flags);
  -     ds->h = headerFree(ds->h);
  -    }
  +     if (ds->Count > 0) {
  +         ds->N = _free(ds->N);
  +         ds->EVR = _free(ds->EVR);
  +         ds->Flags = _free(ds->Flags);
  +         ds->h = headerFree(ds->h);
  +     }
   
  -    ds->DNEVR = _free(ds->DNEVR);
  -    ds->ns.str = _free(ds->ns.str);
  -    memset(&ds->ns, 0, sizeof(ds->ns));
  -    ds->A = _free(ds->A);
  -    ds->Color = _free(ds->Color);
  -    ds->Refs = _free(ds->Refs);
  -    ds->Result = _free(ds->Result);
  -    ds->exclude = mireFreeAll(ds->exclude, ds->nexclude);
  -    ds->include = mireFreeAll(ds->include, ds->ninclude);
  -
  -    (void) rpmdsUnlink(ds, ds->Type);
  -    /*...@-refcounttrans -userelea...@*/
  -    memset(ds, 0, sizeof(*ds));              /* XXX trash and burn */
  -    ds = _free(ds);
  -    /*...@=refcounttrans =userelea...@*/
  +     ds->DNEVR = _free(ds->DNEVR);
  +     ds->ns.str = _free(ds->ns.str);
  +     memset(&ds->ns, 0, sizeof(ds->ns));
  +     ds->A = _free(ds->A);
  +     ds->Color = _free(ds->Color);
  +     ds->Refs = _free(ds->Refs);
  +     ds->Result = _free(ds->Result);
  +     ds->exclude = mireFreeAll(ds->exclude, ds->nexclude);
  +     ds->include = mireFreeAll(ds->include, ds->ninclude);
  +
  +     /*...@-refcounttrans -userelea...@*/
  +     memset(ds, 0, sizeof(*ds));             /* XXX trash and burn */
  +     ds = _free(ds);
  +     /*...@=refcounttrans =userelea...@*/
  +     yarnTwist(use, BY, -1);
  +     use = yarnFreeLock(use);
  +    } else
  +     yarnTwist(ds->use, BY, -1);
       return NULL;
   }
   
  @@ -320,6 +329,7 @@
       Count = he->c;
       if (xx && N != NULL && Count > 0) {
        ds = xcalloc(1, sizeof(*ds));
  +     ds->use = yarnNewLock(0);
        ds->Type = Type;
        ds->h = NULL;
        ds->i = -1;
  @@ -587,6 +597,7 @@
       R = _free(R);
   
       ds = xcalloc(1, sizeof(*ds));
  +    ds->use = yarnNewLock(0);
       ds->Type = Type;
       ds->tagN = tagN;
       ds->Count = 1;
  @@ -622,6 +633,7 @@
       Type = rpmdsTagName(tagN);
   
       ds = xcalloc(1, sizeof(*ds));
  +    ds->use = yarnNewLock(0);
       ds->Type = Type;
       ds->tagN = tagN;
       ds->A = NULL;
  @@ -968,6 +980,7 @@
       size_t nb;
   
       ds->h = (ods->h != NULL ? headerLink(ods->h) : NULL);
  +    ds->use = yarnNewLock(0);
   /*...@-assignexpose@*/
       ds->Type = ods->Type;
   /*...@=assignexpose@*/
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/lib/rpmds.h
  ============================================================================
  $ cvs diff -u -r2.74 -r2.75 rpmds.h
  --- rpm/lib/rpmds.h   14 Oct 2008 20:59:17 -0000      2.74
  +++ rpm/lib/rpmds.h   17 Mar 2009 13:27:46 -0000      2.75
  @@ -37,6 +37,7 @@
    * A dependency set.
    */
   struct rpmds_s {
  +    yarnLock use;            /*!< use count -- return to pool when zero */
   /*...@observer@*/
       const char * Type;               /*!< Tag name. */
   /*...@only@*/ /*...@null@*/
  @@ -74,8 +75,6 @@
       unsigned l;                      /*!< Low element (bsearch). */
       unsigned u;                      /*!< High element (bsearch). */
       int nopromote;           /*!< Don't promote Epoch: in rpmdsCompare()? */
  -/*...@refs@*/
  -    int nrefs;                       /*!< Reference count. */
   };
   #endif       /* _RPMDS_INTERNAL */
   
  @@ .
______________________________________________________________________
RPM Package Manager                                    http://rpm5.org
CVS Sources Repository                                rpm-cvs@rpm5.org

Reply via email to