[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