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