Author: Remi Meier
Branch: c7-refactor
Changeset: r809:0f6f9932b271
Date: 2014-02-21 15:34 +0100
http://bitbucket.org/pypy/stmgc/changeset/0f6f9932b271/

Log:    save roots around self.switch() too

diff --git a/c7/test/test_random.py b/c7/test/test_random.py
--- a/c7/test/test_random.py
+++ b/c7/test/test_random.py
@@ -123,6 +123,7 @@
 
     def register_root(self, r):
         self.saved_roots.append(r)
+        assert len(self.saved_roots) < SHADOWSTACK_LENGTH
 
     def forget_random_root(self):
         # # forget some non-pushed root for now
@@ -463,16 +464,28 @@
             ex.do("assert stm_get_obj_size(%s) == %s" % (r, size))
 
 class OpSwitchThread(Operation):
-    def do(self, ex, global_state, thread_state):
-        trs = thread_state.transaction_state
-        conflicts = trs is not None and trs.check_must_abort()
-        ex.thread_num = thread_state.num
-        #
-        if conflicts:
-            thread_state.abort_transaction()
+    def do(self, ex, global_state, thread_state, new_thread_state=None):
+        if new_thread_state is None:
+            new_thread_state = 
global_state.rnd.choice(global_state.thread_states)
 
-        ex.do(raising_call(conflicts,
-                           "self.switch", thread_state.num))
+        if new_thread_state != thread_state:
+            if thread_state.transaction_state:
+                thread_state.push_roots(ex)
+            ex.do('#')
+            #
+            trs = new_thread_state.transaction_state
+            conflicts = trs is not None and trs.check_must_abort()
+            ex.thread_num = new_thread_state.num
+            #
+            ex.do(raising_call(conflicts,
+                               "self.switch", new_thread_state.num))
+            if conflicts:
+                new_thread_state.abort_transaction()
+            else:
+                new_thread_state.pop_roots(ex)
+                new_thread_state.reload_roots(ex)
+
+        return new_thread_state
 
 
 
@@ -523,11 +536,7 @@
         ]
         for _ in range(200):
             # make sure we are in a transaction:
-            n_thread = rnd.randrange(0, N_THREADS)
-            if n_thread != curr_thread.num:
-                ex.do('#')
-                curr_thread = global_state.thread_states[n_thread]
-                OpSwitchThread().do(ex, global_state, curr_thread)
+            curr_thread = OpSwitchThread().do(ex, global_state, curr_thread)
 
             if curr_thread.transaction_state is None:
                 OpStartTransaction().do(ex, global_state, curr_thread)
@@ -542,8 +551,8 @@
             if ts.transaction_state is not None:
                 if curr_thread != ts:
                     ex.do('#')
-                    curr_thread = ts
-                    OpSwitchThread().do(ex, global_state, curr_thread)
+                    curr_thread = OpSwitchThread().do(ex, global_state, 
curr_thread,
+                                                      new_thread_state=ts)
 
                 # could have aborted in the switch() above:
                 if curr_thread.transaction_state:
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to