mirror of https://github.com/python/cpython
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:
parent
3fb97ae0f7
commit
9bd4a245f2
|
@ -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.
|
||||||
|
|
Loading…
Reference in New Issue