[pypy-commit] stmgc default: Test, covering another "abort(); //XXX".
arigo
noreply at buildbot.pypy.org
Sun May 26 15:02:00 CEST 2013
Author: Armin Rigo <arigo at tunes.org>
Branch:
Changeset: r15:1bcd5a031e38
Date: 2013-05-26 13:39 +0200
http://bitbucket.org/pypy/stmgc/changeset/1bcd5a031e38/
Log: Test, covering another "abort();//XXX".
diff --git a/c3/et.h b/c3/et.h
--- a/c3/et.h
+++ b/c3/et.h
@@ -54,6 +54,9 @@
*
* GCFLAG_STOLEN is set of protected objects after we notice that they
* have been stolen.
+ *
+ * GCFLAG_STUB is used for debugging: it's set on stub objects made by
+ * create_yo_stubs()
*/
#define GCFLAG_OLD (STM_FIRST_GCFLAG << 0)
#define GCFLAG_VISITED (STM_FIRST_GCFLAG << 1)
@@ -62,6 +65,7 @@
#define GCFLAG_WRITE_BARRIER (STM_FIRST_GCFLAG << 4)
#define GCFLAG_NURSERY_MOVED (STM_FIRST_GCFLAG << 5)
#define GCFLAG_STOLEN (STM_FIRST_GCFLAG << 6)
+#define GCFLAG_STUB (STM_FIRST_GCFLAG << 7) /* debugging */
/* this value must be reflected in PREBUILT_FLAGS in stmgc.h */
#define GCFLAG_PREBUILT (GCFLAG_VISITED | \
@@ -75,6 +79,7 @@
"WRITE_BARRIER", \
"NURSERY_MOVED", \
"STOLEN", \
+ "STUB", \
NULL }
/************************************************************/
diff --git a/c3/gcpage.c b/c3/gcpage.c
--- a/c3/gcpage.c
+++ b/c3/gcpage.c
@@ -716,10 +716,16 @@
pobj = (gcptr *)(obj + 1);
_recdump_first = pobj;
memset(_recdump_isptr, 0, sizeof _recdump_isptr);
- stmcb_trace(obj, &_recdump_visit);
- n = stmcb_size(obj) - sizeof(*obj);
- n = (n + sizeof(WORD) - 1) / sizeof(WORD);
+ if ((obj->h_tid & GCFLAG_STUB) == 0) {
+ stmcb_trace(obj, &_recdump_visit);
+
+ n = stmcb_size(obj) - sizeof(*obj);
+ n = (n + sizeof(WORD) - 1) / sizeof(WORD);
+ }
+ else {
+ n = 0;
+ }
for (i = 0; i < n; i++) {
fprintf(stderr, " [%lu]\t%16lx (%ld)\n", i,
(unsigned long)*pobj, (long)*pobj);
diff --git a/c3/nursery.c b/c3/nursery.c
--- a/c3/nursery.c
+++ b/c3/nursery.c
@@ -667,10 +667,9 @@
/* xxx try to avoid duplicate stubs for the same object */
gcptr stub = stmgcpage_malloc(sizeof(*stub));
- stub->h_tid = 0; /* no flags */
+ stub->h_tid = GCFLAG_OLD | GCFLAG_STUB; /* with type_id == 0 */
stub->h_revision = ((revision_t)obj) | 2;
*pobj = stub;
- abort();//XXX
}
static void fix_new_public_to_protected_references(struct tx_descriptor *d)
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
@@ -287,3 +287,26 @@
r.leave_in_parallel()
run_parallel(f1, f2)
assert lib.getlong(pg, 0) == -6666
+
+def test_access_foreign_nursery_use_stubs():
+ pg = palloc_refs(1)
+ def f1(r):
+ q1 = nalloc(HDR + WORD)
+ lib.setlong(q1, 0, 424242)
+ p1 = lib.stm_write_barrier(pg)
+ lib.setptr(p1, 0, q1)
+ assert lib.in_nursery(p1)
+ assert lib.in_nursery(q1)
+ r.set(2)
+ r.wait(3)
+ p3 = lib.stm_read_barrier(pg)
+ assert not lib.in_nursery(p3)
+ def f2(r):
+ r.wait(2)
+ p2 = lib.stm_read_barrier(pg)
+ assert not lib.in_nursery(p2)
+ assert p2
+ q2 = lib.getptr(p2, 0)
+ assert lib.getlong(q2, 0) == 424242
+ r.set(3)
+ run_parallel(f1, f2)
More information about the pypy-commit
mailing list