[pypy-commit] stmgc default: Yet another kind of barrier.
arigo
noreply at buildbot.pypy.org
Thu Aug 22 10:44:38 CEST 2013
Author: Armin Rigo <arigo at tunes.org>
Branch:
Changeset: r489:49c3e0a47ab4
Date: 2013-08-22 10:44 +0200
http://bitbucket.org/pypy/stmgc/changeset/49c3e0a47ab4/
Log: Yet another kind of barrier.
diff --git a/c4/stmgc.h b/c4/stmgc.h
--- a/c4/stmgc.h
+++ b/c4/stmgc.h
@@ -84,6 +84,10 @@
- stm_repeat_write_barrier() can be used on an object on which
we already did stm_write_barrier(), but a potential collection
can have occurred.
+
+ - stm_write_barrier_noptr() is a slightly cheaper version of
+ stm_write_barrier(), for when we are going to write
+ non-gc-pointers into the object.
*/
#if 0 // (optimized version below)
gcptr stm_read_barrier(gcptr);
@@ -91,6 +95,7 @@
gcptr stm_repeat_read_barrier(gcptr);
gcptr stm_immut_read_barrier(gcptr);
gcptr stm_repeat_write_barrier(gcptr); /* <= always returns its argument */
+gcptr stm_write_barrier_noptr(gcptr);
#endif
/* start a new transaction, calls callback(), and when it returns
@@ -219,5 +224,10 @@
stm_RepeatWriteBarrier(obj) \
: (obj))
+#define stm_write_barrier_noptr(obj) \
+ (UNLIKELY((obj)->h_revision != stm_private_rev_num) ? \
+ stm_WriteBarrier(obj) \
+ : (obj))
+
#endif
diff --git a/c4/test/support.py b/c4/test/support.py
--- a/c4/test/support.py
+++ b/c4/test/support.py
@@ -61,6 +61,7 @@
gcptr stm_repeat_read_barrier(gcptr);
gcptr stm_immut_read_barrier(gcptr);
gcptr stm_repeat_write_barrier(gcptr);
+ gcptr stm_write_barrier_noptr(gcptr);
void stm_perform_transaction(gcptr arg, int (*callback)(gcptr, int));
void stm_commit_transaction(void);
void stm_begin_inevitable_transaction(void);
diff --git a/c4/test/test_et.py b/c4/test/test_et.py
--- a/c4/test/test_et.py
+++ b/c4/test/test_et.py
@@ -762,3 +762,21 @@
assert n1 == n
q = lib.rawgetptr(n, 0)
assert lib.rawgetlong(q, 0) == 1298719
+
+def test_write_barrier_noptr():
+ p = nalloc(HDR + WORD)
+ assert lib.stm_write_barrier_noptr(p) == p
+ assert p.h_revision == lib.get_private_rev_num()
+ assert p.h_tid == lib.gettid(p) | 0 # no GC flags
+ assert classify(p) == "private"
+ #
+ lib.stm_commit_transaction()
+ lib.stm_begin_inevitable_transaction()
+ assert classify(p) == "protected"
+ q = lib.stm_write_barrier_noptr(p)
+ assert q == p
+ assert classify(p) == "private_from_protected"
+ assert q == lib.stm_write_barrier_noptr(p)
+ assert q == lib.stm_write_barrier_noptr(q)
+ assert q == lib.stm_write_barrier(p)
+ assert q == lib.stm_write_barrier(q)
More information about the pypy-commit
mailing list