aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/utils/cache/catcache.c29
1 files changed, 17 insertions, 12 deletions
diff --git a/src/backend/utils/cache/catcache.c b/src/backend/utils/cache/catcache.c
index a293f570e1b..9ae143272be 100644
--- a/src/backend/utils/cache/catcache.c
+++ b/src/backend/utils/cache/catcache.c
@@ -370,6 +370,7 @@ CatCacheRemoveCTup(CatCache *cache, CatCTup *ct)
return; /* nothing left to do */
}
+ /* delink from linked list */
dlist_delete(&ct->cache_elem);
/* free associated tuple data */
@@ -452,9 +453,9 @@ CatalogCacheIdInvalidate(int cacheId, uint32 hashValue)
*/
slist_foreach(cache_iter, &CacheHdr->ch_caches)
{
+ CatCache *ccp = slist_container(CatCache, cc_next, cache_iter.cur);
Index hashIndex;
dlist_mutable_iter iter;
- CatCache *ccp = slist_container(CatCache, cc_next, cache_iter.cur);
if (cacheId != ccp->id)
continue;
@@ -555,7 +556,7 @@ AtEOXact_CatCache(bool isCommit)
{
slist_iter cache_iter;
- slist_foreach(cache_iter, &(CacheHdr->ch_caches))
+ slist_foreach(cache_iter, &CacheHdr->ch_caches)
{
CatCache *ccp = slist_container(CatCache, cc_next, cache_iter.cur);
dlist_iter iter;
@@ -682,7 +683,7 @@ CatalogCacheFlushCatalog(Oid catId)
CACHE2_elog(DEBUG2, "CatalogCacheFlushCatalog called for %u", catId);
- slist_foreach(iter, &(CacheHdr->ch_caches))
+ slist_foreach(iter, &CacheHdr->ch_caches)
{
CatCache *cache = slist_container(CatCache, cc_next, iter.cur);
@@ -770,8 +771,10 @@ InitCatCache(int id,
/*
* allocate a new cache structure
+ *
+ * Note: we rely on zeroing to initialize all the dlist headers correctly
*/
- cp = (CatCache *) palloc0(sizeof(CatCache) + nbuckets * sizeof(dlist_node));
+ cp = (CatCache *) palloc0(sizeof(CatCache) + nbuckets * sizeof(dlist_head));
/*
* initialize the cache's relation information for the relation
@@ -790,9 +793,6 @@ InitCatCache(int id,
for (i = 0; i < nkeys; ++i)
cp->cc_key[i] = key[i];
- dlist_init(&cp->cc_lists);
- MemSet(&cp->cc_bucket, 0, nbuckets * sizeof(dlist_head));
-
/*
* new cache is initialized as far as we can go for now. print some
* debugging information, if appropriate.
@@ -1060,7 +1060,7 @@ SearchCatCache(CatCache *cache,
ScanKeyData cur_skey[CATCACHE_MAXKEYS];
uint32 hashValue;
Index hashIndex;
- dlist_mutable_iter iter;
+ dlist_iter iter;
dlist_head *bucket;
CatCTup *ct;
Relation relation;
@@ -1094,10 +1094,12 @@ SearchCatCache(CatCache *cache,
/*
* scan the hash bucket until we find a match or exhaust our tuples
+ *
+ * Note: it's okay to use dlist_foreach here, even though we modify the
+ * dlist within the loop, because we don't continue the loop afterwards.
*/
bucket = &cache->cc_bucket[hashIndex];
-
- dlist_foreach_modify(iter, bucket)
+ dlist_foreach(iter, bucket)
{
bool res;
@@ -1382,6 +1384,9 @@ SearchCatCacheList(CatCache *cache,
/*
* scan the items until we find a match or exhaust our list
+ *
+ * Note: it's okay to use dlist_foreach here, even though we modify the
+ * dlist within the loop, because we don't continue the loop afterwards.
*/
dlist_foreach(iter, &cache->cc_lists)
{
@@ -1807,11 +1812,11 @@ PrepareToInvalidateCacheTuple(Relation relation,
* ----------------
*/
- slist_foreach(iter, &(CacheHdr->ch_caches))
+ slist_foreach(iter, &CacheHdr->ch_caches)
{
+ CatCache *ccp = slist_container(CatCache, cc_next, iter.cur);
uint32 hashvalue;
Oid dbid;
- CatCache *ccp = slist_container(CatCache, cc_next, iter.cur);
if (ccp->cc_reloid != reloid)
continue;