From 2308a8556fecdf3388ec4ac4c2a1588619a62b94 Mon Sep 17 00:00:00 2001 From: Thomas Munro Date: Sun, 14 Mar 2021 14:53:10 +1300 Subject: [PATCH 9/9] Specialize sort routine used by multixact.c. --- src/backend/access/transam/multixact.c | 35 +++++++------------------- 1 file changed, 9 insertions(+), 26 deletions(-) diff --git a/src/backend/access/transam/multixact.c b/src/backend/access/transam/multixact.c index 1f9f1a1fa1..97c5120cdd 100644 --- a/src/backend/access/transam/multixact.c +++ b/src/backend/access/transam/multixact.c @@ -344,7 +344,6 @@ static void RecordNewMultiXact(MultiXactId multi, MultiXactOffset offset, static MultiXactId GetNewMultiXactId(int nmembers, MultiXactOffset *offset); /* MultiXact cache management */ -static int mxactMemberComparator(const void *arg1, const void *arg2); static MultiXactId mXactCacheGetBySet(int nmembers, MultiXactMember *members); static int mXactCacheGetById(MultiXactId multi, MultiXactMember **members); static void mXactCachePut(MultiXactId multi, int nmembers, @@ -1453,29 +1452,13 @@ retry: return truelength; } -/* - * mxactMemberComparator - * qsort comparison function for MultiXactMember - * - * We can't use wraparound comparison for XIDs because that does not respect - * the triangle inequality! Any old sort order will do. - */ -static int -mxactMemberComparator(const void *arg1, const void *arg2) -{ - MultiXactMember member1 = *(const MultiXactMember *) arg1; - MultiXactMember member2 = *(const MultiXactMember *) arg2; - - if (member1.xid > member2.xid) - return 1; - if (member1.xid < member2.xid) - return -1; - if (member1.status > member2.status) - return 1; - if (member1.status < member2.status) - return -1; - return 0; -} +#define ST_SORT qsort_mxact_members +#define ST_ELEMENT_TYPE MultiXactMember +#define ST_COMPARE(a, b) (((((int64) (a)->status) << 8) | (int64) (a)->xid) - ((((int64) (b)->status) << 8) | (int64) (b)->xid)) +#define ST_COMPARE_TYPE int64 +#define ST_SCOPE static +#define ST_DEFINE +#include "lib/sort_template.h" /* * mXactCacheGetBySet @@ -1499,7 +1482,7 @@ mXactCacheGetBySet(int nmembers, MultiXactMember *members) mxid_to_string(InvalidMultiXactId, nmembers, members)); /* sort the array so comparison is easy */ - qsort(members, nmembers, sizeof(MultiXactMember), mxactMemberComparator); + qsort_mxact_members(members, nmembers); dlist_foreach(iter, &MXactCache) { @@ -1605,7 +1588,7 @@ mXactCachePut(MultiXactId multi, int nmembers, MultiXactMember *members) memcpy(entry->members, members, nmembers * sizeof(MultiXactMember)); /* mXactCacheGetBySet assumes the entries are sorted, so sort them */ - qsort(entry->members, nmembers, sizeof(MultiXactMember), mxactMemberComparator); + qsort_mxact_members(entry->members, nmembers); dlist_push_head(&MXactCache, &entry->node); if (MXactCacheMembers++ >= MAX_CACHE_ENTRIES) -- 2.30.1