static shmem_startup_hook_type prev_shmem_startup_hook = NULL;
static CHashTable chash;
+static HTAB *dynahash;
void
_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
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();
+}