/* * Unregister entry from cleanup list of the cache * */ static void Cache_UnregisterCleanup(Cache *cache, CacheEntry *entry) { Assert(NULL != cache); Assert(NULL != entry); Dlelem *crtElem = DLGetHead(cache->ownedEntries); while (NULL != crtElem && DLE_VAL(crtElem) != entry) { crtElem = DLGetSucc(crtElem); } Assert(NULL != crtElem && "could not locate element"); /* Found matching element. Remove and free. Note that entry is untouched */ DLRemove(crtElem); DLFreeElem(crtElem); }
/* remove invalid notifies before returning */ void PQcleanNotify() { Dlelem *e, *next; PQNotifyList *p; e = DLGetHead(pqNotifyList); while (e) { next = DLGetSucc(e); p = (PQNotifyList*)DLE_VAL(e); if (p->valid == 0) { DLRemove(e); DLFreeElem(e); pfree(p); } e = next; } }
/* * Releases/Surrenders all entries held by this client * * During normal functionality, client should release all the owned entries * and this is a no-op. In case of a client error, this callback makes sure all * entries are returned to the cache. * * This function operates on client data and does not need to be synchronized. */ void Cache_SurrenderClientEntries(Cache *cache) { Assert(NULL != cache); uint32 nAcquiredEntries = 0; uint32 nCachedEntries = 0; Dlelem *elt = NULL; /* Surrender all owned entries */ while (NULL != (elt = DLRemHead(cache->ownedEntries))) { CacheEntry *entry = DLE_VAL(elt); switch(entry->state) { case CACHE_ENTRY_ACQUIRED: Cache_ReleaseAcquired(cache, entry, false /* unregisterCleanup */); nAcquiredEntries++; break; case CACHE_ENTRY_CACHED: case CACHE_ENTRY_DELETED: Cache_ReleaseCached(cache, entry, false /* unregisterCleanup */); nCachedEntries++; break; default: Assert(false && "unexpected cache entry state"); } /* Free linked list element */ DLFreeElem(elt); } if (nAcquiredEntries > 0 || nCachedEntries > 0) { elog(gp_workfile_caching_loglevel, "Cleanup released %u acquired and %u cached entries from client", nAcquiredEntries, nCachedEntries); } }