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.
This commit is contained in:
Gregory P. Smith 2011-01-04 18:33:38 +00:00
parent 3fb97ae0f7
commit 9bd4a245f2
1 changed files with 13 additions and 4 deletions

View File

@ -395,6 +395,10 @@ class _Event(_Verbose):
self._cond = Condition(Lock()) self._cond = Condition(Lock())
self._flag = False 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): def is_set(self):
return self._flag return self._flag
@ -642,6 +646,13 @@ class Thread(_Verbose):
# sys.exc_info since it can be changed between instances # sys.exc_info since it can be changed between instances
self._stderr = _sys.stderr 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): def _set_daemon(self):
# Overridden in _MainThread and _DummyThread # Overridden in _MainThread and _DummyThread
return current_thread().daemon return current_thread().daemon
@ -984,12 +995,11 @@ class _DummyThread(Thread):
def __init__(self): def __init__(self):
Thread.__init__(self, name=_newname("Dummy-%d")) 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 # can never be used by a _DummyThread. Since a _DummyThread
# instance is immortal, that's bad, so release this resource. # instance is immortal, that's bad, so release this resource.
del self._block del self._block
self._started.set() self._started.set()
self._set_ident() self._set_ident()
with _active_limbo_lock: with _active_limbo_lock:
@ -1066,8 +1076,7 @@ def _after_fork():
thread._ident = ident thread._ident = ident
# Any condition variables hanging off of the active thread may # Any condition variables hanging off of the active thread may
# be in an invalid state, so we reinitialize them. # be in an invalid state, so we reinitialize them.
thread._block.__init__() thread._reset_internal_locks()
thread._started._cond.__init__()
new_active[ident] = thread new_active[ident] = thread
else: else:
# All the others are already stopped. # All the others are already stopped.