Author: Armin Rigo <[email protected]>
Branch: stmgc-c7
Changeset: r76029:59ea05c4e7c5
Date: 2015-02-21 12:53 +0100
http://bitbucket.org/pypy/pypy/changeset/59ea05c4e7c5/
Log: import stmgc/78281a990907
diff --git a/rpython/translator/stm/src_stm/revision
b/rpython/translator/stm/src_stm/revision
--- a/rpython/translator/stm/src_stm/revision
+++ b/rpython/translator/stm/src_stm/revision
@@ -1,1 +1,1 @@
-6c6a18d9e312
+78281a990907
diff --git a/rpython/translator/stm/src_stm/stm/gcpage.c
b/rpython/translator/stm/src_stm/stm/gcpage.c
--- a/rpython/translator/stm/src_stm/stm/gcpage.c
+++ b/rpython/translator/stm/src_stm/stm/gcpage.c
@@ -135,11 +135,19 @@
char *p = allocate_outside_nursery_large(size_rounded_up);
uintptr_t nobj = p - stm_object_pages;
+ dprintf(("allocate_preexisting: %p\n", (object_t *)nobj));
long j;
for (j = 0; j <= NB_SEGMENTS; j++) {
char *dest = get_segment_base(j) + nobj;
memcpy(dest, initial_data, size_rounded_up);
((struct object_s *)dest)->stm_flags = GCFLAG_WRITE_BARRIER;
+#ifdef STM_TESTS
+ /* can't really enable this check outside tests, because there is
+ a change that the transaction_state changes in parallel */
+ if (j && get_priv_segment(j)->transaction_state != TS_NONE) {
+ assert(!was_read_remote(get_segment_base(j), (object_t *)nobj));
+ }
+#endif
}
release_privatization_lock();
diff --git a/rpython/translator/stm/src_stm/stm/hashtable.c
b/rpython/translator/stm/src_stm/stm/hashtable.c
--- a/rpython/translator/stm/src_stm/stm/hashtable.c
+++ b/rpython/translator/stm/src_stm/stm/hashtable.c
@@ -108,8 +108,12 @@
static bool _stm_was_read_by_anybody(object_t *obj)
{
+ /* can only be safely called during major GC, when all other threads
+ are suspended */
long i;
for (i = 1; i <= NB_SEGMENTS; i++) {
+ if (get_priv_segment(i)->transaction_state == TS_NONE)
+ continue;
if (was_read_remote(get_segment_base(i), obj))
return true;
}
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit