[Python-checkins] cpython: Issue 18808: blind attempt to repair some buildbot failures.

tim.peters python-checkins at python.org
Sun Sep 8 04:23:24 CEST 2013


http://hg.python.org/cpython/rev/5cfd7b2eb994
changeset:   85604:5cfd7b2eb994
user:        Tim Peters <tim at python.org>
date:        Sat Sep 07 21:23:03 2013 -0500
summary:
  Issue 18808:  blind attempt to repair some buildbot failures.

test_is_alive_after_fork is failing on some old Linux kernels, but
passing on all newer ones.  Since virtually anything can go wrong
with locks when mixing threads with fork, replace the most likely
cause with a redundant simple data member.

files:
  Lib/threading.py |  7 ++++++-
  1 files changed, 6 insertions(+), 1 deletions(-)


diff --git a/Lib/threading.py b/Lib/threading.py
--- a/Lib/threading.py
+++ b/Lib/threading.py
@@ -552,6 +552,10 @@
         self._tstate_lock = None
         self._started = Event()
         self._stopped = Event()
+        # _is_stopped should be the same as _stopped.is_set().  The bizarre
+        # duplication is to allow test_is_alive_after_fork to pass on old
+        # Linux kernels.  See issue 18808.
+        self._is_stopped = False
         self._initialized = True
         # sys.stderr is not stored in the class like
         # sys.exc_info since it can be changed between instances
@@ -707,6 +711,7 @@
 
     def _stop(self):
         self._stopped.set()
+        self._is_stopped = True
 
     def _delete(self):
         "Remove current thread from the dict of currently running threads."
@@ -793,7 +798,7 @@
         assert self._initialized, "Thread.__init__() not called"
         if not self._started.is_set():
             return False
-        if not self._stopped.is_set():
+        if not self._is_stopped:
             return True
         # The Python part of the thread is done, but the C part may still be
         # waiting to run.

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list