Author: Armin Rigo <[email protected]>
Branch:
Changeset: r223:e5e6919b5a54
Date: 2013-06-21 14:10 +0200
http://bitbucket.org/pypy/stmgc/changeset/e5e6919b5a54/
Log: Running major collections in test_random starts to work.
diff --git a/c4/et.c b/c4/et.c
--- a/c4/et.c
+++ b/c4/et.c
@@ -1211,7 +1211,8 @@
assert(newrev & 1);
ACCESS_ONCE(stm_private_rev_num) = newrev;
fprintf(stderr, "%p: stm_local_revision = %ld\n", d, (long)newrev);
- assert(d->private_revision_ref = &stm_private_rev_num);
+ assert(d->private_revision_ref == &stm_private_rev_num);
+ assert(d->read_barrier_cache_ref == &stm_read_barrier_cache);
UpdateChainHeads(d, cur_time, localrev);
@@ -1459,6 +1460,7 @@
assert(d->my_lock >= LOCKED);
stm_private_rev_num = -d->my_lock;
d->private_revision_ref = &stm_private_rev_num;
+ d->read_barrier_cache_ref = &stm_read_barrier_cache;
d->max_aborts = -1;
d->tx_prev = NULL;
d->tx_next = stm_tx_head;
diff --git a/c4/et.h b/c4/et.h
--- a/c4/et.h
+++ b/c4/et.h
@@ -153,6 +153,7 @@
long long longest_abort_info_time;
revision_t *private_revision_ref;
struct FXCache recent_reads_cache;
+ char **read_barrier_cache_ref;
struct tx_descriptor *tx_prev, *tx_next;
};
diff --git a/c4/gcpage.c b/c4/gcpage.c
--- a/c4/gcpage.c
+++ b/c4/gcpage.c
@@ -389,7 +389,6 @@
}
d->num_read_objects_known_old = d->list_of_read_objects.size;
- fxcache_clear(&d->recent_reads_cache);
/* We are now after visiting all objects, and we know the
* transaction isn't aborting because of this collection. We have
@@ -545,8 +544,10 @@
struct tx_descriptor *d;
struct tx_descriptor *saved = thread_descriptor;
revision_t saved_private_rev = stm_private_rev_num;
- char *read_barrier_cache = stm_read_barrier_cache;
+ char *saved_read_barrier_cache = stm_read_barrier_cache;
+
assert(saved_private_rev == *saved->private_revision_ref);
+ assert(saved_read_barrier_cache == *saved->read_barrier_cache_ref);
for (d = stm_tx_head; d; d = d->tx_next) {
/* Force a minor collection to run in the thread 'd'.
@@ -554,21 +555,24 @@
collection was not preceeded by a minor collection if the
thread is busy in a system call for example.
*/
- if (stmgc_minor_collect_anything_to_do(d) ||
- (d->public_descriptor->stolen_objects.size != 0)) {
+ if (d != saved) {
/* Hack: temporarily pretend that we "are" the other thread...
*/
thread_descriptor = d;
stm_private_rev_num = *d->private_revision_ref;
- fxcache_install(&d->recent_reads_cache);
- //assert(stmgc_nursery_hiding(d, 0));
+ stm_read_barrier_cache = *d->read_barrier_cache_ref;
+
stmgc_minor_collect_no_abort();
- //assert(stmgc_nursery_hiding(d, 1));
+
+ assert(stm_private_rev_num == *d->private_revision_ref);
+ *d->read_barrier_cache_ref = stm_read_barrier_cache;
+
thread_descriptor = saved;
stm_private_rev_num = saved_private_rev;
- stm_read_barrier_cache = read_barrier_cache;
+ stm_read_barrier_cache = saved_read_barrier_cache;
}
}
+ stmgc_minor_collect_no_abort();
}
diff --git a/c4/lists.h b/c4/lists.h
--- a/c4/lists.h
+++ b/c4/lists.h
@@ -192,17 +192,12 @@
void _fxcache_reset(struct FXCache *fxcache);
-static inline void fxcache_install(struct FXCache *fxcache)
-{
- stm_read_barrier_cache = (char *)(fxcache->cache + fxcache->shift);
-}
-
static inline void fxcache_clear(struct FXCache *fxcache)
{
fxcache->shift++;
if (fxcache->shift > FX_TOTAL - FX_ENTRIES)
_fxcache_reset(fxcache);
- fxcache_install(fxcache);
+ stm_read_barrier_cache = (char *)(fxcache->cache + fxcache->shift);
}
#define FXCACHE_AT(obj) \
diff --git a/c4/test/test_random.py b/c4/test/test_random.py
--- a/c4/test/test_random.py
+++ b/c4/test/test_random.py
@@ -5,10 +5,7 @@
# a default seed that changes every day, but that can be easily recovered
DEFAULT_SEED = int(time.strftime("%y%m%d", time.gmtime()))
-# XXXXXXXXXXXXXXXXXXXXXX
-# XXX reintroduce me XXX
-# XXXXXXXXXXXXXXXXXXXXXX
-DO_MAJOR_COLLECTS = False
+DO_MAJOR_COLLECTS = True
def setup_function(_):
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit