From: Vinay Sajip Date: Fri, 4 Apr 2014 09:51:49 +0000 (+0100) Subject: Issue #21149: Improved thread-safety in logging cleanup during interpreter shutdown. X-Git-Tag: v3.4.1rc1~129 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=156307bfd67aacbdeb393c6bf831b6a63df92eb2;p=python Issue #21149: Improved thread-safety in logging cleanup during interpreter shutdown. --- diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py index 478c5afdae..181bc150d0 100644 --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -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): """ diff --git a/Misc/NEWS b/Misc/NEWS index 9e59154011..4f27a991e9 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -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.