[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