Beginnings of dynahash testing code.
authorRobert Haas <rhaas@postgresql.org>
Wed, 25 Jul 2012 14:52:54 +0000 (10:52 -0400)
committerRobert Haas <rhaas@postgresql.org>
Tue, 27 Jan 2015 02:24:21 +0000 (02:24 +0000)
contrib/hashtest/hashtest.c

index 7c68e982a4bbeb5e963653ebb106f70cbf38bd6c..0b18bfccb9645e976bae8e194592861143fd04e1 100644 (file)
@@ -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();
+}