Issue #21149: Improved thread-safety in logging cleanup during interpreter shutdown.

This commit is contained in:
Vinay Sajip 2014-04-04 10:51:49 +01:00
parent b30b34c1aa
commit 156307bfd6
2 changed files with 12 additions and 8 deletions

View File

@ -711,16 +711,17 @@ def _removeHandlerRef(wr):
Remove a handler reference from the internal cleanup list.
"""
# This function can be called during module teardown, when globals are
# set to None. If _acquireLock is None, assume this is the case and do
# nothing.
if (_acquireLock is not None and _handlerList is not None and
_releaseLock is not None):
_acquireLock()
# set to None. It can also be called from another thread. So we need to
# pre-emptively grab the necessary globals and check if they're None,
# to prevent race conditions and failures during interpreter shutdown.
acquire, release, handlers = _acquireLock, _releaseLock, _handlerList
if acquire and release and handlers:
acquire()
try:
if wr in _handlerList:
_handlerList.remove(wr)
if wr in handlers:
handlers.remove(wr)
finally:
_releaseLock()
release()
def _addHandlerRef(handler):
"""

View File

@ -27,6 +27,9 @@ Core and Builtins
Library
-------
- Issue #21149: Improved thread-safety in logging cleanup during interpreter
shutdown. Thanks to Devin Jeanpierre for the patch.
- Issue #20145: `assertRaisesRegex` and `assertWarnsRegex` now raise a
TypeError if the second argument is not a string or compiled regex.