[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