[pypy-commit] stmgc hashtable: Next test
arigo
noreply at buildbot.pypy.org
Sat Oct 18 17:27:37 CEST 2014
Author: Armin Rigo <arigo at tunes.org>
Branch: hashtable
Changeset: r1480:e2b457616c30
Date: 2014-10-18 17:27 +0200
http://bitbucket.org/pypy/stmgc/changeset/e2b457616c30/
Log: Next test
diff --git a/c7/stm/hashtable.c b/c7/stm/hashtable.c
--- a/c7/stm/hashtable.c
+++ b/c7/stm/hashtable.c
@@ -29,10 +29,13 @@
typedef TLPREFIX struct stm_hashtable_entry_s {
struct object_s header;
+ uint32_t userdata;
uintptr_t index;
object_t *object;
} stm_hashtable_entry_t;
+uint32_t stm_hashtable_entry_userdata;
+
#define INITIAL_HASHTABLE_SIZE 8
#define PERTURB_SHIFT 5
@@ -219,7 +222,9 @@
if (rc > 6) {
entry = (stm_hashtable_entry_t *)
_stm_allocate_old(sizeof(stm_hashtable_entry_t));
+ entry->userdata = stm_hashtable_entry_userdata;
entry->index = index;
+ entry->object = NULL;
write_fence(); /* make sure 'entry' is fully initialized here */
table->items[i] = entry;
write_fence(); /* make sure 'table->items' is written here */
diff --git a/c7/stmgc.h b/c7/stmgc.h
--- a/c7/stmgc.h
+++ b/c7/stmgc.h
@@ -508,7 +508,7 @@
/* Support for light finalizers. This is a simple version of
finalizers that guarantees not to do anything fancy, like not
resurrecting objects. */
-void (*stmcb_light_finalizer)(object_t *);
+extern void (*stmcb_light_finalizer)(object_t *);
void stm_enable_light_finalizer(object_t *);
/* Support for regular finalizers. Unreachable objects with
@@ -525,7 +525,7 @@
transaction. For older objects, the finalizer is called from a
random thread between regular transactions, in a new custom
transaction. */
-void (*stmcb_finalizer)(object_t *);
+extern void (*stmcb_finalizer)(object_t *);
object_t *stm_allocate_with_finalizer(ssize_t size_rounded_up);
/* Hashtables. Keys are 64-bit unsigned integers, values are
@@ -538,6 +538,7 @@
void stm_hashtable_free(stm_hashtable_t *);
object_t *stm_hashtable_read(stm_hashtable_t *, uintptr_t key);
void stm_hashtable_write(stm_hashtable_t *, uintptr_t key, object_t *nvalue);
+extern uint32_t stm_hashtable_entry_userdata;
/* ==================== END ==================== */
diff --git a/c7/test/support.py b/c7/test/support.py
--- a/c7/test/support.py
+++ b/c7/test/support.py
@@ -171,6 +171,7 @@
void stm_hashtable_free(stm_hashtable_t *);
object_t *stm_hashtable_read(stm_hashtable_t *, uintptr_t key);
void stm_hashtable_write(stm_hashtable_t *, uintptr_t key, object_t *nvalue);
+uint32_t stm_hashtable_entry_userdata;
""")
@@ -410,6 +411,7 @@
CARD_SIZE = lib._STM_CARD_SIZE # 16b at least
NB_SEGMENTS = lib.STM_NB_SEGMENTS
FAST_ALLOC = lib._STM_FAST_ALLOC
+lib.stm_hashtable_entry_userdata = 42 + HDR + 2 * 8
class Conflict(Exception):
pass
diff --git a/c7/test/test_hashtable.py b/c7/test/test_hashtable.py
--- a/c7/test/test_hashtable.py
+++ b/c7/test/test_hashtable.py
@@ -12,3 +12,15 @@
got = lib.stm_hashtable_read(h, index)
assert got == ffi.NULL
lib.stm_hashtable_free(h)
+
+ def test_set_value(self):
+ self.start_transaction()
+ h = lib.stm_hashtable_create()
+ lp1 = stm_allocate(16)
+ lib.stm_hashtable_write(h, 12345678901, lp1)
+ assert lib.stm_hashtable_read(h, 12345678901) == lp1
+ for i in range(64):
+ index = 12345678901 ^ (1 << i)
+ assert lib.stm_hashtable_read(h, index) == ffi.NULL
+ assert lib.stm_hashtable_read(h, 12345678901) == lp1
+ lib.stm_hashtable_free(h)
More information about the pypy-commit
mailing list