From ef3c1e45a1f869544280f65d1eeba8544b028735 Mon Sep 17 00:00:00 2001
From: Thomas Munro <thomas.munro@gmail.com>
Date: Sat, 27 Mar 2021 09:07:22 +1300
Subject: [PATCH v13 5/5] fixup: use simplehash instead of dynahash

---
 src/backend/access/transam/slru.c | 41 ++++++++++++++++++++-----------
 src/include/access/slru.h         |  4 ++-
 2 files changed, 30 insertions(+), 15 deletions(-)

diff --git a/src/backend/access/transam/slru.c b/src/backend/access/transam/slru.c
index f823c2a0c8..ba9c0efc81 100644
--- a/src/backend/access/transam/slru.c
+++ b/src/backend/access/transam/slru.c
@@ -54,12 +54,11 @@
 #include "access/slru.h"
 #include "access/transam.h"
 #include "access/xlog.h"
+#include "common/hashfn.h"
 #include "miscadmin.h"
 #include "pgstat.h"
 #include "storage/fd.h"
 #include "storage/shmem.h"
-#include "utils/dynahash.h"
-#include "utils/hsearch.h"
 
 #define SlruFileName(ctl, path, seg) \
 	snprintf(path, MAXPGPATH, "%s/%04X", (ctl)->Dir, seg)
@@ -85,8 +84,24 @@ typedef struct SlruMappingTableEntry
 {
 	int			pageno;
 	int			slotno;
+	char		status;
 } SlruMappingTableEntry;
 
+/* Instantiate specialized hash table routines. */
+#define SH_PREFIX smte
+#define SH_ELEMENT_TYPE SlruMappingTableEntry
+#define SH_KEY_TYPE int
+#define SH_KEY pageno
+#define SH_HASH_KEY(table, key) murmurhash32(key)
+#define SH_EQUAL(table, a, b) a == b
+#define SH_IS_EMPTY_KEY(table, pageno) pageno == -1
+#define SH_EMPTY_KEY(table) -1
+#define SH_DECLARE
+#define SH_DEFINE
+#define SH_SCOPE static inline
+#define SH_IN_PLACE
+#include "lib/simplehash.h"
+
 /*
  * Populate a file tag describing a segment file.  We only use the segment
  * number, since we can derive everything else we need by having separate
@@ -179,8 +194,7 @@ SimpleLruShmemSize(int nslots, int nlsns)
 	if (nlsns > 0)
 		sz += MAXALIGN(nslots * nlsns * sizeof(XLogRecPtr));	/* group_lsn[] */
 
-	return BUFFERALIGN(sz) + BLCKSZ * nslots +
-		hash_estimate_size(nslots, sizeof(SlruMappingTableEntry));
+	return BUFFERALIGN(sz) + BLCKSZ * nslots + smte_estimate_size(nslots);
 }
 
 /*
@@ -200,8 +214,7 @@ SimpleLruInit(SlruCtl ctl, const char *name, int nslots, int nlsns,
 			  SyncRequestHandler sync_handler)
 {
 	char		mapping_table_name[SHMEM_INDEX_KEYSIZE];
-	HASHCTL		mapping_table_info;
-	HTAB	   *mapping_table;
+	smte_hash  *mapping_table;
 	SlruShared	shared;
 	bool		found;
 
@@ -274,13 +287,13 @@ SimpleLruInit(SlruCtl ctl, const char *name, int nslots, int nlsns,
 		Assert(found);
 
 	/* Create or find the buffer mapping table. */
-	memset(&mapping_table_info, 0, sizeof(mapping_table_info));
-	mapping_table_info.keysize = sizeof(int);
-	mapping_table_info.entrysize = sizeof(SlruMappingTableEntry);
 	snprintf(mapping_table_name, sizeof(mapping_table_name),
 			 "%s Mapping Table", name);
-	mapping_table = ShmemInitHash(mapping_table_name, nslots, nslots,
-								  &mapping_table_info, HASH_ELEM | HASH_BLOBS);
+	mapping_table = ShmemInitStruct(mapping_table_name,
+									smte_estimate_size(nslots),
+									&found);
+	if (!found)
+		smte_create(mapping_table, nslots, NULL);
 
 	/*
 	 * Initialize the unshared control struct, including directory path. We
@@ -1658,7 +1671,7 @@ SlruMappingFind(SlruCtl ctl, int pageno)
 {
 	SlruMappingTableEntry *mapping;
 
-	mapping = hash_search(ctl->mapping_table, &pageno, HASH_FIND, NULL);
+	mapping = smte_lookup(ctl->mapping_table, pageno);
 	if (mapping)
 		return mapping->slotno;
 
@@ -1671,7 +1684,7 @@ SlruMappingAdd(SlruCtl ctl, int pageno, int slotno)
 	SlruMappingTableEntry *mapping;
 	bool		found PG_USED_FOR_ASSERTS_ONLY;
 
-	mapping = hash_search(ctl->mapping_table, &pageno, HASH_ENTER, &found);
+	mapping = smte_insert(ctl->mapping_table, pageno, &found);
 	mapping->slotno = slotno;
 
 	Assert(!found);
@@ -1682,7 +1695,7 @@ SlruMappingRemove(SlruCtl ctl, int pageno)
 {
 	bool		found PG_USED_FOR_ASSERTS_ONLY;
 
-	hash_search(ctl->mapping_table, &pageno, HASH_REMOVE, &found);
+	found = smte_delete(ctl->mapping_table, pageno);
 
 	Assert(found);
 }
diff --git a/src/include/access/slru.h b/src/include/access/slru.h
index 8aa3efc0ee..b3d28ff135 100644
--- a/src/include/access/slru.h
+++ b/src/include/access/slru.h
@@ -104,6 +104,8 @@ typedef struct SlruSharedData
 
 typedef SlruSharedData *SlruShared;
 
+struct smte_hash;
+
 /*
  * SlruCtlData is an unshared structure that points to the active information
  * in shared memory.
@@ -111,7 +113,7 @@ typedef SlruSharedData *SlruShared;
 typedef struct SlruCtlData
 {
 	SlruShared	shared;
-	HTAB	   *mapping_table;
+	struct smte_hash *mapping_table;
 
 	/*
 	 * Which sync handler function to use when handing sync requests over to
-- 
2.30.1

