From b9817c2a4879ca94bf8e7ab979a88d5436e16c66 Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Wed, 25 Jul 2012 10:52:54 -0400 Subject: [PATCH] Beginnings of dynahash testing code. --- contrib/hashtest/hashtest.c | 57 +++++++++++++++++++++++++++++++++---- 1 file changed, 52 insertions(+), 5 deletions(-) diff --git a/contrib/hashtest/hashtest.c b/contrib/hashtest/hashtest.c index 7c68e982a4..0b18bfccb9 100644 --- a/contrib/hashtest/hashtest.c +++ b/contrib/hashtest/hashtest.c @@ -36,6 +36,7 @@ static CHashDescriptor cdesc = { static shmem_startup_hook_type prev_shmem_startup_hook = NULL; static CHashTable chash; +static HTAB *dynahash; void _PG_init(void) @@ -53,15 +54,24 @@ _PG_init(void) static void hashtest_shmem_startup(void) { + HASHCTL info; + if (prev_shmem_startup_hook) prev_shmem_startup_hook(); + + /* Initialize concurrent hash table. */ chash = CHashInitialize(chash, &cdesc); -} -Datum -test_dynahash(PG_FUNCTION_ARGS) -{ - PG_RETURN_VOID(); + /* Initialize shared dynahash table. */ + info.keysize = sizeof(cdesc.key_size); + info.entrysize = sizeof(cdesc.element_size); + info.hash = tag_hash; + info.num_partitions = 16; + + dynahash = ShmemInitHash("hashtest-dynahash", + cdesc.capacity, cdesc.capacity, + &info, + HASH_ELEM | HASH_FUNCTION | HASH_PARTITION); } Datum @@ -98,3 +108,40 @@ test_chash(PG_FUNCTION_ARGS) PG_RETURN_VOID(); } + +static bool +dynahash_insert(uint32 key, uint32 val) +{ + bool found; + uint32 hashcode; + hentry *e; + + hashcode = get_hash_value(dynahash, (void *) &key); + /* lock */ + e = hash_search_with_hash_value(dynahash, (void *) &key, + hashcode, HASH_ENTER, &found); + if (!found) + e->val = val; + /* unlock */ + + return !found; +} + +Datum +test_dynahash(PG_FUNCTION_ARGS) +{ + uint32 i; + bool ok; + + for (i = 0; i < 1000000; ++i) + { + ok = dynahash_insert(i, i * 31); + if (!ok) + elog(LOG, "insert %u: failed", i); + ok = dynahash_insert(i, i * 31); + if (ok) + elog(LOG, "insert %u: worked twice", i); + } + + PG_RETURN_VOID(); +} -- 2.39.5