Author: Remi Meier <remi.me...@gmail.com>
Branch: stmgc-c8
Changeset: r91602:8d2c43276bbe
Date: 2017-06-14 09:48 +0200
http://bitbucket.org/pypy/pypy/changeset/8d2c43276bbe/

Log:    (tobweber) fix wrong thread state after waiting for free segment

diff --git a/pypy/stm/print_stm_log.py b/pypy/stm/print_stm_log.py
--- a/pypy/stm/print_stm_log.py
+++ b/pypy/stm/print_stm_log.py
@@ -118,6 +118,7 @@
         self._transaction_aborting = False
         self._transaction_inev = None
         self._transaction_detached_time = 0.0
+        self._transaction_awaiting_free_seg = False
         self._in_minor_coll = None
         assert self._prev[1] == "stop"
 
@@ -169,6 +170,10 @@
         if self._transaction_inev is None:
             self._transaction_inev = [entry, None]
 
+    def transaction_await_free_segment(self, entry):
+        self._transaction_awaiting_free_seg = True
+        self.transaction_pause(entry)
+
     def transaction_pause(self, entry):
         self.progress(entry.timestamp, "pause")
         if (entry.event == STM_WAIT_OTHER_INEVITABLE and
@@ -176,7 +181,12 @@
             self._transaction_inev[1] = entry.timestamp
 
     def transaction_unpause(self, entry, out_conflicts):
-        self.progress(entry.timestamp, "run")
+        if self._transaction_awaiting_free_seg:
+            # waiting for free segment does not mean we are running now
+            self.progress(entry.timestamp, "stop")
+            self._transaction_awaiting_free_seg = False
+        else:
+            self.progress(entry.timestamp, "run")
         if self._transaction_inev and self._transaction_inev[1] is not None:
             wait_time = entry.timestamp - self._transaction_inev[1]
             self.wait_for_other_inev(wait_time, out_conflicts)
@@ -310,8 +320,9 @@
             t.become_inevitable(entry)
         elif entry.event == STM_CONTENTION_WRITE_READ:
             t.contention_write_read(entry, conflicts)
-        elif entry.event in (STM_WAIT_FREE_SEGMENT,
-                             STM_WAIT_SYNCING,
+        elif entry.event == STM_WAIT_FREE_SEGMENT:
+            t.transaction_await_free_segment(entry)
+        elif entry.event in (STM_WAIT_SYNCING,
                              STM_WAIT_SYNC_PAUSE,
                              STM_WAIT_OTHER_INEVITABLE):
             t.transaction_pause(entry)
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to