Author: Armin Rigo <[email protected]>
Branch: 
Changeset: r288:75bca7fddfc3
Date: 2013-06-26 18:06 +0200
http://bitbucket.org/pypy/stmgc/changeset/75bca7fddfc3/

Log:    Copy this test from c3.

diff --git a/c4/test/test_abort.py b/c4/test/test_abort.py
new file mode 100644
--- /dev/null
+++ b/c4/test/test_abort.py
@@ -0,0 +1,107 @@
+import py
+from support import *
+
+# -------------------------------------------------------------------------
+# General warning: this tests aborts by really running a C setjmp(longjmp.
+# This kind of works if there are Python frames in-between, as long as
+# we fix a few things (see _GC_ON_CPYTHON), but not out-of-the-box on PyPy.
+# -------------------------------------------------------------------------
+
+
+def setup_function(f):
+    lib.stm_clear_between_tests()
+    lib.stm_initialize_tests(getattr(f, 'max_aborts', 0))
+
+def teardown_function(_):
+    lib.stm_finalize()
+
+
+def test_peform_transaction():
+    seen = []
+    #
+    @perform_transaction
+    def run(retry_counter):
+        if len(seen) < 5:
+            seen.append(retry_counter)
+            return True
+    assert seen == [0] * 5
+
+def test_abort():
+    seen = []
+    #
+    @perform_transaction
+    def run(retry_counter):
+        if len(seen) < 5000:
+            seen.append(retry_counter)
+            abort_and_retry()
+    assert seen == range(5000)
+
+def test_global_to_local_copies():
+    p1 = palloc(HDR)
+    #
+    @perform_transaction
+    def run(retry_counter):
+        p2 = lib.stm_write_barrier(p1)
+        if retry_counter == 0:
+            abort_and_retry()
+        else:
+            major_collect()
+
+def test_old_objects_to_trace():
+    p1 = palloc_refs(1)
+    #
+    @perform_transaction
+    def run(retry_counter):
+        if retry_counter == 0:
+            p2 = lib.stm_write_barrier(p1)
+            lib.stm_push_root(p2)
+            minor_collect()
+            p2 = lib.stm_pop_root()
+            setptr(p2, 0, nalloc(HDR))
+            # write some invalid pointer, we're aborting anyway
+            lib.rawsetlong(p2, 0, 4)
+            abort_and_retry()
+        else:
+            major_collect()
+
+def test_push_restore():
+    @perform_transaction
+    def run(retry_counter):
+        if retry_counter == 0:
+            lib.stm_push_root(ffi.NULL)
+            abort_and_retry()
+
+def test_young_objects_outside_nursery():
+    p1list = [palloc_refs(1) for i in range(20)]
+    #
+    @perform_transaction
+    def run(retry_counter):
+        if retry_counter == 0:
+            # make sure there are a couple of young_objects_outside_nursery
+            p2list = [lib.stm_write_barrier(p1) for p1 in p1list]
+            for p2 in p2list:
+                lib.stm_push_root(p2)
+            minor_collect()
+            # write some invalid pointers, we're aborting anyway
+            for i in range(len(p2list)):
+                p2 = lib.stm_pop_root()
+                lib.rawsetlong(p2, 0, 4)
+            abort_and_retry()
+        else:
+            major_collect()
+
+def test_abort_protected_to_private():
+    pg = palloc(HDR + WORD)
+    p1 = lib.stm_write_barrier(pg)
+    lib.setlong(p1, 0, 32128247)
+    #
+    @perform_transaction
+    def run(retry_counter):
+        assert lib.getlong(pg, 0) == 32128247
+        if retry_counter == 0:
+            lib.setlong(pg, 0, 4737372)
+            abort_and_retry()
+        else:
+            lib.setlong(pg, 0, 838311)
+    #
+    assert lib.getlong(pg, 0) == 838311
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to