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