Author: Armin Rigo <[email protected]>
Branch: 
Changeset: r10:ee48768dd5e6
Date: 2013-05-26 12:52 +0200
http://bitbucket.org/pypy/stmgc/changeset/ee48768dd5e6/

Log:    Add a test and tweak tweak tweak

diff --git a/c3/et.c b/c3/et.c
--- a/c3/et.c
+++ b/c3/et.c
@@ -360,7 +360,6 @@
       if (!(v & 1))               // "is a pointer", i.e.
         {                         //   "has a more recent revision"
           /* ... unless it is a GCFLAG_STOLEN object */
-          abort();//XXX
           if (R->h_tid & GCFLAG_STOLEN)
             {
               assert(is_young(R));
diff --git a/c3/nursery.c b/c3/nursery.c
--- a/c3/nursery.c
+++ b/c3/nursery.c
@@ -980,7 +980,6 @@
             N->h_tid |= GCFLAG_PUBLIC_TO_PRIVATE;
             g2l_insert(&d->public_to_private, N, L);
             gcptrlist_insert(&d->public_to_young, N);
-            abort();//XXX
         }
         recdump1("STOLEN", R);
     }
diff --git a/c3/test/support.py b/c3/test/support.py
--- a/c3/test/support.py
+++ b/c3/test/support.py
@@ -298,6 +298,8 @@
         self.step = 0
         self.steplocks = {0: thread.allocate_lock()}
         self.settinglock = thread.allocate_lock()
+        self.parallel_locks = (thread.allocate_lock(), thread.allocate_lock())
+        self.parallel_locks[0].acquire()
         self.resulting_exception = None
         locks = []
         for fn in fns:
@@ -368,6 +370,31 @@
                 except thread.error:
                     pass
 
+    def wait_while_in_parallel(self):
+        # parallel_locks[0] is acquired, parallel_locks[1] is released
+        res = self.parallel_locks[1].acquire(False)
+        assert res
+        # parallel_locks[0] is acquired, parallel_locks[1] is acquired
+        print 'wait_while_in_parallel enter'
+        self.parallel_locks[0].release()
+        self.parallel_locks[1].acquire()
+        print 'wait_while_in_parallel leave'
+        # parallel_locks[0] is acquired, parallel_locks[1] is acquired
+        self.parallel_locks[1].release()
+        res = self.parallel_locks[0].acquire(False)
+        assert not res
+        # parallel_locks[0] is acquired, parallel_locks[1] is released
+
+    def enter_in_parallel(self):
+        print 'enter_in_parallel: waiting...'
+        # wait for parallel_locks[0]
+        self.parallel_locks[0].acquire()
+        print 'enter_in_parallel'
+
+    def leave_in_parallel(self):
+        print 'leave_in_parallel'
+        self.parallel_locks[1].release()
+
 # ____________________________________________________________
 
 def oalloc(size):
diff --git a/c3/test/test_nursery.py b/c3/test/test_nursery.py
--- a/c3/test/test_nursery.py
+++ b/c3/test/test_nursery.py
@@ -252,3 +252,31 @@
         assert not lib.in_nursery(p2)
         r.set(3)
     run_parallel(f1, f2)
+
+def test_access_foreign_nursery_with_private_copy_1():
+    # this version should not cause conflicts
+    pg = palloc(HDR + WORD)
+    lib.rawsetlong(pg, 0, 420063)
+    seen = []
+    def f1(r):
+        p1 = lib.stm_write_barrier(pg)
+        assert lib.in_nursery(p1)
+        lib.rawsetlong(p1, 0, 9387987)
+        def cb(c):
+            assert c == 0
+            p4 = lib.stm_write_barrier(p1)
+            assert lib.rawgetlong(p4, 0) == 9387987
+            lib.rawsetlong(p4, 0, -6666)
+            r.wait_while_in_parallel()
+        perform_transaction(cb)
+    def f2(r):
+        def cb(c):
+            assert c == 0
+            r.enter_in_parallel()
+            p2 = lib.stm_read_barrier(pg)
+            assert not lib.in_nursery(p2)
+            assert lib.rawgetlong(p2, 0) == 9387987
+        perform_transaction(cb)
+        r.leave_in_parallel()
+    run_parallel(f1, f2)
+    assert lib.getlong(pg, 0) == -6666
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to