/*@null@*/ void * rpmioFreePoolItem(/*@killref@*/ /*@null@*/ rpmioItem item, const char * msg, const char * fn, unsigned ln) /*@modifies item @*/ { rpmioPool pool; if (item == NULL) return NULL; #ifdef NOTYET assert(item->pool != NULL); /* XXX (*pool->fini) is likely necessary */ #endif yarnPossess(item->use); if ((pool = item->pool) != NULL && pool->flags && msg != NULL) { const char * imsg = (pool->dbg ? (*pool->dbg)((void *)item) : ""); /*@-modfilesys@*/ fprintf(stderr, "--> %s %p -- %ld %s at %s:%u%s\n", pool->name, item, yarnPeekLock(item->use), msg, fn, ln, imsg); /*@=modfilesys@*/ } if (yarnPeekLock(item->use) <= 1L) { if (pool != NULL && pool->fini != NULL) (*pool->fini) ((void *)item); VALGRIND_MEMPOOL_FREE(pool, item + 1); item = rpmioPutPool(item); } else yarnTwist(item->use, BY, -1); /*@-retalias@*/ /* XXX returning the deref'd item is used to detect nrefs = 0 */ return (void *) item; /*@=retalias@*/ }
rpmzLog rpmzLogLink(rpmzLog zlog) { long nrefs; if (zlog == NULL) return NULL; yarnPossess(zlog->_item.use); nrefs = yarnPeekLock(zlog->_item.use); if (_rpmzlog_debug) fprintf(stderr, " ++ zlog %p[%ld]\n", zlog, nrefs+1); yarnTwist(zlog->_item.use, BY, 1); return zlog; }
/*@-internalglobs@*/ rpmioItem rpmioLinkPoolItem(rpmioItem item, const char * msg, const char * fn, unsigned ln) { rpmioPool pool; if (item == NULL) return NULL; yarnPossess(item->use); if ((pool = item->pool) != NULL && pool->flags && msg != NULL) { const char * imsg = (pool->dbg ? (*pool->dbg)((void *)item) : ""); /*@-modfilesys@*/ fprintf(stderr, "--> %s %p ++ %ld %s at %s:%u%s\n", pool->name, item, yarnPeekLock(item->use)+1, msg, fn, ln, imsg); /*@=modfilesys@*/ } yarnTwist(item->use, BY, 1); return item; }
rpmzLog rpmzLogFree(rpmzLog zlog) { long nrefs; rpmzMsg me; if (zlog == NULL) return NULL; yarnPossess(zlog->_item.use); nrefs = yarnPeekLock(zlog->_item.use); if (_rpmzlog_debug) fprintf(stderr, " -- zlog %p[%ld]\n", zlog, nrefs); #ifdef NOTYET assert(nrefs > 0); #else if (nrefs <= 0) fprintf(stderr, "==> FIXME: %s: zlog %p[%ld]\n", __FUNCTION__, zlog, nrefs); #endif if (nrefs == 1) { yarnLock use = zlog->_item.use; if (zlog->msg_tail != NULL) { while ((me = zlog->msg_head) != NULL) { zlog->msg_head = me->next; me->msg = _free(me->msg); /*@-compdestroy@*/ me = _free(me); /*@=compdestroy@*/ zlog->msg_count--; } #ifdef NOTYET assert(zlog->msg_count == 0); #else if (zlog->msg_count != 0) fprintf(stderr, "==> FIXME: %s: zlog %p[%ld] count %d\n", __FUNCTION__, zlog, nrefs, zlog->msg_count); #endif zlog->msg_count = 0; zlog->msg_tail = NULL; } zlog = _free(zlog); yarnTwist(use, BY, -1); use = yarnFreeLock(use); } else yarnTwist(zlog->_item.use, BY, -1); return NULL; }
/*@-internalglobs@*/ rpmioItem rpmioUnlinkPoolItem(rpmioItem item, const char * msg, const char * fn, unsigned ln) { rpmioPool pool; if (item == NULL) return NULL; yarnPossess(item->use); if ((pool = item->pool) != NULL && pool->flags && msg != NULL) { const char * imsg = (pool->dbg ? (*pool->dbg)((void *)item) : ""); /*@-modfilesys@*/ fprintf(stderr, "--> %s %p -- %ld %s at %s:%u%s\n", pool->name, item, yarnPeekLock(item->use), msg, fn, ln, imsg); /*@=modfilesys@*/ } yarnTwist(item->use, BY, -1); /*@-retalias@*/ /* XXX returning the deref'd item is used to detect nrefs = 0 */ return item; /*@=retalias@*/ }
static rpmvf rpmvfFree(/*@only@*/ rpmvf vf) /*@modifies vf @*/ { if (vf) { #ifdef NOTYET yarnPossess(vf->_item.use); if (yarnPeekLock(vf->_item.use) <= 1L) { yarnLock use = vf->_item.use; vf->fn = _free(vf->fn); vf = _free(vf); yarnTwist(use, TO, 0); use = yarnFreeLock(use); } else yarnTwist(vf->_item.use, BY, -1); #else vf->fn = _free(vf->fn); vf = _free(vf); #endif } return NULL; }