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

Reply via email to