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