[Python-checkins] cpython (merge 3.4 -> default): Closes #21149: Improved thread-safety in logging cleanup during interpreter

vinay.sajip python-checkins at python.org
Fri Apr 4 11:57:47 CEST 2014


http://hg.python.org/cpython/rev/76689a706900
changeset:   90125:76689a706900
parent:      90122:d9337fe963cc
parent:      90124:b5c91b61991a
user:        Vinay Sajip <vinay_sajip at yahoo.co.uk>
date:        Fri Apr 04 10:57:25 2014 +0100
summary:
  Closes #21149: Improved thread-safety in logging cleanup during interpreter shutdown.

files:
  Lib/logging/__init__.py |  17 +++++++++--------
  Misc/NEWS               |   3 +++
  2 files changed, 12 insertions(+), 8 deletions(-)


diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py
--- a/Lib/logging/__init__.py
+++ b/Lib/logging/__init__.py
@@ -711,16 +711,17 @@
     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
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -29,6 +29,9 @@
 Library
 -------
 
+- Issue #21149: Improved thread-safety in logging cleanup during interpreter
+  shutdown. Thanks to Devin Jeanpierre for the patch.
+
 - Issue #21058: Fix a leak of file descriptor in
   :func:`tempfile.NamedTemporaryFile`, close the file descriptor if
   :func:`io.open` fails

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list