summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorGregory P. Smith <greg@mad-scientist.com>2011-01-04 18:33:38 (GMT)
committerGregory P. Smith <greg@mad-scientist.com>2011-01-04 18:33:38 (GMT)
commit9bd4a245f2ed0ce5a59652976c19ca74e9db518f (patch)
tree7823dcfa1f3ad80194b104d9ec12e3e1973acdbe /Lib
parent3fb97ae0f7ebcc723c59e5fe0d2826bb9c595d6f (diff)
downloadcpython-9bd4a245f2ed0ce5a59652976c19ca74e9db518f.zip
cpython-9bd4a245f2ed0ce5a59652976c19ca74e9db518f.tar.gz
cpython-9bd4a245f2ed0ce5a59652976c19ca74e9db518f.tar.bz2
Fix the new bug introduced in the r87710 fix for issue 6643. DummyThread
deletes its _block attribute, deal with that. This prevents an uncaught exception in a thread during test_thread. This refactors a bit to better match what I did in the r87727 backport to 2.7.
Diffstat (limited to 'Lib')
-rw-r--r--Lib/threading.py17
1 files changed, 13 insertions, 4 deletions
diff --git a/Lib/threading.py b/Lib/threading.py
index b586bb0..392ad14 100644
--- a/Lib/threading.py
+++ b/Lib/threading.py
@@ -395,6 +395,10 @@ class _Event(_Verbose):
self._cond = Condition(Lock())
self._flag = False
+ def _reset_internal_locks(self):
+ # private! called by Thread._reset_internal_locks by _after_fork()
+ self._cond.__init__()
+
def is_set(self):
return self._flag
@@ -642,6 +646,13 @@ class Thread(_Verbose):
# sys.exc_info since it can be changed between instances
self._stderr = _sys.stderr
+ def _reset_internal_locks(self):
+ # private! Called by _after_fork() to reset our internal locks as
+ # they may be in an invalid state leading to a deadlock or crash.
+ if hasattr(self, '_block'): # DummyThread deletes _block
+ self._block.__init__()
+ self._started._reset_internal_locks()
+
def _set_daemon(self):
# Overridden in _MainThread and _DummyThread
return current_thread().daemon
@@ -984,12 +995,11 @@ class _DummyThread(Thread):
def __init__(self):
Thread.__init__(self, name=_newname("Dummy-%d"))
- # Thread.__block consumes an OS-level locking primitive, which
+ # Thread._block consumes an OS-level locking primitive, which
# can never be used by a _DummyThread. Since a _DummyThread
# instance is immortal, that's bad, so release this resource.
del self._block
-
self._started.set()
self._set_ident()
with _active_limbo_lock:
@@ -1066,8 +1076,7 @@ def _after_fork():
thread._ident = ident
# Any condition variables hanging off of the active thread may
# be in an invalid state, so we reinitialize them.
- thread._block.__init__()
- thread._started._cond.__init__()
+ thread._reset_internal_locks()
new_active[ident] = thread
else:
# All the others are already stopped.