From 922bef2bb73f22b215e07baf2550998cd8d6694b Mon Sep 17 00:00:00 2001 From: Maxim Orlov Date: Thu, 24 Aug 2023 16:28:50 +0300 Subject: [PATCH v1 3/4] Make use of vectorized bmss_free function --- src/backend/access/heap/heapam.c | 16 ++++------------ src/backend/commands/publicationcmds.c | 3 +-- src/backend/executor/nodeAppend.c | 3 +-- src/backend/optimizer/path/indxpath.c | 3 +-- src/backend/optimizer/path/joinpath.c | 3 +-- src/backend/statistics/extended_stats.c | 3 +-- src/backend/utils/cache/relcache.c | 21 ++++++--------------- src/include/nodes/bitmapset.h | 3 +++ 8 files changed, 18 insertions(+), 37 deletions(-) diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c index 6a66214a58..dba20614f8 100644 --- a/src/backend/access/heap/heapam.c +++ b/src/backend/access/heap/heapam.c @@ -3372,12 +3372,8 @@ l2: ReleaseBuffer(vmbuffer); *update_indexes = TU_None; - bms_free(hot_attrs); - bms_free(sum_attrs); - bms_free(key_attrs); - bms_free(id_attrs); - bms_free(modified_attrs); - bms_free(interesting_attrs); + bmss_free(hot_attrs, sum_attrs, key_attrs, id_attrs, modified_attrs, + interesting_attrs); return result; } @@ -3887,12 +3883,8 @@ l2: if (old_key_tuple != NULL && old_key_copied) heap_freetuple(old_key_tuple); - bms_free(hot_attrs); - bms_free(sum_attrs); - bms_free(key_attrs); - bms_free(id_attrs); - bms_free(modified_attrs); - bms_free(interesting_attrs); + bmss_free(hot_attrs, sum_attrs, key_attrs, id_attrs, modified_attrs, + interesting_attrs); return TM_Ok; } diff --git a/src/backend/commands/publicationcmds.c b/src/backend/commands/publicationcmds.c index e4fe6cc72a..3dbbf878b1 100644 --- a/src/backend/commands/publicationcmds.c +++ b/src/backend/commands/publicationcmds.c @@ -431,8 +431,7 @@ pub_collist_contains_invalid_column(Oid pubid, Relation relation, List *ancestor } } - bms_free(idattrs); - bms_free(columns); + bmss_free(idattrs, columns); } ReleaseSysCache(tuple); diff --git a/src/backend/executor/nodeAppend.c b/src/backend/executor/nodeAppend.c index 609df6b9e6..4eef4cb53a 100644 --- a/src/backend/executor/nodeAppend.c +++ b/src/backend/executor/nodeAppend.c @@ -418,9 +418,8 @@ ExecReScanAppend(AppendState *node) node->as_prune_state->execparamids)) { node->as_valid_subplans_identified = false; - bms_free(node->as_valid_subplans); + bmss_free(node->as_valid_subplans, node->as_valid_asyncplans); node->as_valid_subplans = NULL; - bms_free(node->as_valid_asyncplans); node->as_valid_asyncplans = NULL; } diff --git a/src/backend/optimizer/path/indxpath.c b/src/backend/optimizer/path/indxpath.c index 6a93d767a5..d840fb5e10 100644 --- a/src/backend/optimizer/path/indxpath.c +++ b/src/backend/optimizer/path/indxpath.c @@ -1847,8 +1847,7 @@ check_index_only(RelOptInfo *rel, IndexOptInfo *index) /* Do we have all the necessary attributes? */ result = bms_is_subset(attrs_used, index_canreturn_attrs); - bms_free(attrs_used); - bms_free(index_canreturn_attrs); + bmss_free(attrs_used, index_canreturn_attrs); return result; } diff --git a/src/backend/optimizer/path/joinpath.c b/src/backend/optimizer/path/joinpath.c index f9fd89e734..6b597fc812 100644 --- a/src/backend/optimizer/path/joinpath.c +++ b/src/backend/optimizer/path/joinpath.c @@ -412,8 +412,7 @@ have_unsafe_outer_join_ref(PlannerInfo *root, } /* Waste no memory when we reject a path here */ - bms_free(unsatisfied); - bms_free(satisfied); + bmss_free(unsatisfied, satisfied); return result; } diff --git a/src/backend/statistics/extended_stats.c b/src/backend/statistics/extended_stats.c index 9f67a57724..2af13b9e3e 100644 --- a/src/backend/statistics/extended_stats.c +++ b/src/backend/statistics/extended_stats.c @@ -1261,8 +1261,7 @@ choose_best_statistics(List *stats, char requiredkind, bool inh, num_matched = bms_num_members(matched_attnums) + bms_num_members(matched_exprs); - bms_free(matched_attnums); - bms_free(matched_exprs); + bmss_free(matched_attnums, matched_exprs); /* * save the actual number of keys in the stats so that we can choose diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c index 1f813e5946..adef3eee55 100644 --- a/src/backend/utils/cache/relcache.c +++ b/src/backend/utils/cache/relcache.c @@ -2440,11 +2440,8 @@ RelationDestroyRelation(Relation relation, bool remember_tupdesc) FreeTriggerDesc(relation->trigdesc); list_free_deep(relation->rd_fkeylist); lists_free(relation->rd_indexlist, relation->rd_statlist); - bms_free(relation->rd_keyattr); - bms_free(relation->rd_pkattr); - bms_free(relation->rd_idattr); - bms_free(relation->rd_hotblockingattr); - bms_free(relation->rd_summarizedattr); + bmss_free(relation->rd_keyattr, relation->rd_pkattr, relation->rd_idattr, + relation->rd_hotblockingattr, relation->rd_summarizedattr); if (relation->rd_pubdesc) pfree(relation->rd_pubdesc); if (relation->rd_options) @@ -5370,26 +5367,20 @@ restart: { /* Gotta do it over ... might as well not leak memory */ lists_free(newindexoidlist, indexoidlist); - bms_free(uindexattrs); - bms_free(pkindexattrs); - bms_free(idindexattrs); - bms_free(hotblockingattrs); - bms_free(summarizedattrs); + bmss_free(uindexattrs, pkindexattrs, idindexattrs, hotblockingattrs, + summarizedattrs); goto restart; } /* Don't leak the old values of these bitmaps, if any */ relation->rd_attrsvalid = false; - bms_free(relation->rd_keyattr); + bmss_free(relation->rd_keyattr, relation->rd_pkattr, relation->rd_idattr, + relation->rd_hotblockingattr, relation->rd_summarizedattr); relation->rd_keyattr = NULL; - bms_free(relation->rd_pkattr); relation->rd_pkattr = NULL; - bms_free(relation->rd_idattr); relation->rd_idattr = NULL; - bms_free(relation->rd_hotblockingattr); relation->rd_hotblockingattr = NULL; - bms_free(relation->rd_summarizedattr); relation->rd_summarizedattr = NULL; /* diff --git a/src/include/nodes/bitmapset.h b/src/include/nodes/bitmapset.h index 14de6a9ff1..0c1bdbb4c1 100644 --- a/src/include/nodes/bitmapset.h +++ b/src/include/nodes/bitmapset.h @@ -84,6 +84,9 @@ extern int bms_compare(const Bitmapset *a, const Bitmapset *b); extern Bitmapset *bms_make_singleton(int x); extern void bms_free(Bitmapset *a); +#define bmss_free(...) \ + func_vectorizor(bms_free, __VA_ARGS__) + extern Bitmapset *bms_union(const Bitmapset *a, const Bitmapset *b); extern Bitmapset *bms_intersect(const Bitmapset *a, const Bitmapset *b); extern Bitmapset *bms_difference(const Bitmapset *a, const Bitmapset *b); -- 2.41.0