[pypy-commit] stmgc default: public->private

arigo noreply at buildbot.pypy.org
Wed Jun 5 16:59:19 CEST 2013


Author: Armin Rigo <arigo at tunes.org>
Branch: 
Changeset: r68:2f624ecb97a7
Date: 2013-06-05 16:55 +0200
http://bitbucket.org/pypy/stmgc/changeset/2f624ecb97a7/

Log:	public->private

diff --git a/c3/et.c b/c3/et.c
--- a/c3/et.c
+++ b/c3/et.c
@@ -317,29 +317,32 @@
 
 static gcptr LocalizePublic(struct tx_descriptor *d, gcptr R)
 {
-  abort();
-#if 0
   if (R->h_tid & GCFLAG_PUBLIC_TO_PRIVATE)
     {
       wlog_t *entry;
       gcptr L;
       G2L_FIND(d->public_to_private, R, entry, goto not_found);
       L = entry->val;
-      assert(L->h_revision == stm_local_revision);
+      assert(L->h_revision == stm_private_rev_num);   /* private object */
       return L;
     }
-  else
-    R->h_tid |= GCFLAG_PUBLIC_TO_PRIVATE;
+  R->h_tid |= GCFLAG_PUBLIC_TO_PRIVATE;
 
  not_found:;
   gcptr L = stmgc_duplicate(R, 0);
-  assert(L->h_revision == stm_local_revision);
+  assert(!(L->h_tid & GCFLAG_BACKUP_COPY));
+  assert(!(L->h_tid & GCFLAG_STOLEN));
+  assert(!(L->h_tid & GCFLAG_STUB));
+  L->h_tid &= ~(GCFLAG_OLD               |
+                GCFLAG_VISITED           |
+                GCFLAG_PUBLIC            |
+                GCFLAG_PREBUILT_ORIGINAL |
+                GCFLAG_PUBLIC_TO_PRIVATE |
+                GCFLAG_WRITE_BARRIER     |
+                0);
+  L->h_revision = stm_private_rev_num;
   g2l_insert(&d->public_to_private, R, L);
-  gcptrlist_insert(&d->public_to_young, R);
-  AddInReadSet(d, R);
-  /*mark*/
   return L;
-#endif
 }
 
 gcptr stm_WriteBarrier(gcptr P)
@@ -348,7 +351,12 @@
   struct tx_descriptor *d = thread_descriptor;
   assert(d->active >= 1);
 
-  W = LocalizeProtected(d, P);
+  /*P = stm_DirectReadBarrier(P);*/
+
+  if (P->h_tid & GCFLAG_PUBLIC)
+    W = LocalizePublic(d, P);
+  else
+    W = LocalizeProtected(d, P);
 
   fprintf(stderr, "write_barrier: %p -> %p\n", P, W);
 
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
@@ -114,3 +114,15 @@
                                        GCFLAG_PUBLIC |
                                        GCFLAG_PREBUILT_ORIGINAL)
     assert classify(p) == "public"
+
+def test_change_prebuilt_object():
+    p = palloc(HDR + WORD)
+    lib.rawsetlong(p, 0, 28971289)
+    flags = p.h_tid
+    assert (flags & GCFLAG_PUBLIC_TO_PRIVATE) == 0
+    assert classify(p) == "public"
+    p2 = lib.stm_write_barrier(p)
+    assert p2 != p
+    assert classify(p) == "public"
+    assert classify(p2) == "private"
+    assert p.h_tid == flags | GCFLAG_PUBLIC_TO_PRIVATE


More information about the pypy-commit mailing list