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