[pypy-commit] stmgc default: stm_pointer_equal_prebuilt()

arigo noreply at buildbot.pypy.org
Sat Aug 3 14:44:50 CEST 2013


Author: Armin Rigo <arigo at tunes.org>
Branch: 
Changeset: r474:9dc18268f0da
Date: 2013-08-03 14:42 +0200
http://bitbucket.org/pypy/stmgc/changeset/9dc18268f0da/

Log:	stm_pointer_equal_prebuilt()

diff --git a/c4/extra.c b/c4/extra.c
--- a/c4/extra.c
+++ b/c4/extra.c
@@ -153,6 +153,19 @@
     return (p1 == p2);
 }
 
+_Bool stm_pointer_equal_prebuilt(gcptr p1, gcptr p2)
+{
+    assert(p2 != NULL);
+    assert(p2->h_tid & GCFLAG_PREBUILT_ORIGINAL);
+
+    if (p1 == p2)
+        return 1;
+
+    /* the only possible case to still get True is if p2 == p1->h_original */
+    return (p1 != NULL) && (p1->h_original == p2) &&
+        !(p1->h_tid & GCFLAG_PREBUILT_ORIGINAL);
+}
+
 /************************************************************/
 
 void stm_abort_info_push(gcptr obj, long fieldoffsets[])
diff --git a/c4/stmgc.h b/c4/stmgc.h
--- a/c4/stmgc.h
+++ b/c4/stmgc.h
@@ -41,6 +41,7 @@
 /* returns nonzero if the two object-copy pointers belong to the
 same original object */
 _Bool stm_pointer_equal(gcptr, gcptr);
+_Bool stm_pointer_equal_prebuilt(gcptr, gcptr); /* 2nd arg is known prebuilt */
 
 /* to push/pop objects into the local shadowstack */
 #if 0     // (optimized version below)
diff --git a/c4/test/support.py b/c4/test/support.py
--- a/c4/test/support.py
+++ b/c4/test/support.py
@@ -50,6 +50,7 @@
     revision_t stm_hash(gcptr);
     revision_t stm_id(gcptr);
     _Bool stm_pointer_equal(gcptr, gcptr);
+    _Bool stm_pointer_equal_prebuilt(gcptr, gcptr);
     void stm_push_root(gcptr);
     gcptr stm_pop_root(void);
     void stm_set_max_aborts(int max_aborts);
diff --git a/c4/test/test_extra.py b/c4/test/test_extra.py
--- a/c4/test/test_extra.py
+++ b/c4/test/test_extra.py
@@ -129,3 +129,30 @@
                    0, 0, 0, 0, 0, 1, 1, 0, 0,
                    0, 0, 0, 0, 0, 0, 0, 1, 1,
                    0, 0, 0, 0, 0, 0, 0, 1, 1]
+
+def test_pointer_equal_prebuilt():
+    p1 = palloc(HDR + WORD)
+    p2 = palloc(HDR + WORD)
+    p3 = oalloc(HDR + WORD)
+    p4 = nalloc(HDR + WORD)
+    lib.stm_commit_transaction()
+    lib.stm_begin_inevitable_transaction()
+    p1b = lib.stm_write_barrier(p1)
+    p2b = lib.stm_write_barrier(p2)
+    p3b = lib.stm_write_barrier(p3)
+    p4b = lib.stm_write_barrier(p4)
+    #
+    got = []
+    for qa in [ffi.NULL, p1, p1b, p2, p2b, p3, p3b, p4, p4b]:
+        for qb in [p1, p2]:
+            got.append(lib.stm_pointer_equal_prebuilt(qa, qb))
+    #
+    assert got == [0, 0,
+                   1, 0,
+                   1, 0,
+                   0, 1,
+                   0, 1,
+                   0, 0,
+                   0, 0,
+                   0, 0,
+                   0, 0]


More information about the pypy-commit mailing list