[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