Author: Armin Rigo <[email protected]>
Branch: 
Changeset: r73:e3da2bafef96
Date: 2013-06-05 18:44 +0200
http://bitbucket.org/pypy/stmgc/changeset/e3da2bafef96/

Log:    Next test.

diff --git a/c3/et.c b/c3/et.c
--- a/c3/et.c
+++ b/c3/et.c
@@ -129,6 +129,18 @@
             }
         }
 
+      if (P->h_tid & GCFLAG_PUBLIC_TO_PRIVATE)
+        {
+          wlog_t *item;
+          G2L_FIND(d->public_to_private, P, item, goto no_private_obj);
+
+          P = item->val;
+          assert(!(P->h_tid & GCFLAG_PUBLIC));
+          assert(P->h_revision == stm_private_rev_num);
+          return P;
+        }
+    no_private_obj:
+
       if (UNLIKELY(v > d->start_time))   // object too recent?
         {
           if (v >= LOCKED)
@@ -299,6 +311,13 @@
                 0);
   L->h_revision = stm_private_rev_num;
   g2l_insert(&d->public_to_private, R, L);
+  fprintf(stderr, "write_barrier: adding %p -> %p to public_to_private\n",
+          R, L);
+
+  /* must remove R from the read_barrier_cache, because returning R is no
+     longer a valid result */
+  fxcache_remove(&d->recent_reads_cache, R);
+
   return L;
 }
 
@@ -308,7 +327,7 @@
   struct tx_descriptor *d = thread_descriptor;
   assert(d->active >= 1);
 
-  /*P = stm_DirectReadBarrier(P);*/
+  P = stm_read_barrier(P);
 
   if (P->h_tid & GCFLAG_PUBLIC)
     W = LocalizePublic(d, P);
diff --git a/c3/lists.h b/c3/lists.h
--- a/c3/lists.h
+++ b/c3/lists.h
@@ -208,6 +208,12 @@
     FXCACHE_AT(newobj) = newobj;
 }
 
+static inline void fxcache_remove(struct FXCache *fxcache, gcptr oldobj)
+{
+    assert(stm_read_barrier_cache == (char*)(fxcache->cache + fxcache->shift));
+    FXCACHE_AT(oldobj) = NULL;
+}
+
 /************************************************************/
 
 #endif
diff --git a/c3/test/test_et.py b/c3/test/test_et.py
--- a/c3/test/test_et.py
+++ b/c3/test/test_et.py
@@ -178,3 +178,16 @@
     assert lib.stm_read_barrier(p1) == p3
     assert list_of_read_objects() == [p3]
     assert p1.h_revision == int(ffi.cast("revision_t", p3))   # shortcutted
+
+def test_read_barrier_public_to_private():
+    p = palloc(HDR)
+    p2 = lib.stm_write_barrier(p)
+    assert p2 != p
+    assert classify(p) == "public"
+    assert classify(p2) == "private"
+    assert list_of_read_objects() == [p]
+    assert p.h_tid & GCFLAG_PUBLIC
+    assert p.h_tid & GCFLAG_PUBLIC_TO_PRIVATE
+    p3 = lib.stm_read_barrier(p)
+    assert p3 == p2
+    assert list_of_read_objects() == [p]
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to