[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