Author: Armin Rigo <ar...@tunes.org> 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 pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit