]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.11] gh-96727: Document restrictions on Handler.emit() with respect to locking...
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Tue, 20 Sep 2022 08:52:09 +0000 (01:52 -0700)
committerPablo Galindo <pablogsal@gmail.com>
Sat, 22 Oct 2022 19:06:05 +0000 (20:06 +0100)
(cherry picked from commit 6ad47b41a650a13b4a9214309c10239726331eb8)

Doc/library/logging.rst

index eacba56d0477e27dbb684e3f86416b74479aacec..9390f065fb26902c8661e3e90a0efdc9c61ab86f 100644 (file)
@@ -522,6 +522,22 @@ subclasses. However, the :meth:`__init__` method in subclasses needs to call
       is intended to be implemented by subclasses and so raises a
       :exc:`NotImplementedError`.
 
+      .. warning:: This method is called after a handler-level lock is acquired, which
+         is released after this method returns. When you override this method, note
+         that you should be careful when calling anything that invokes other parts of
+         the logging API which might do locking, because that might result in a
+         deadlock. Specifically:
+
+         * Logging configuration APIs acquire the module-level lock, and then
+           individual handler-level locks as those handlers are configured.
+
+         * Many logging APIs lock the module-level lock. If such an API is called
+           from this method, it could cause a deadlock if a configuration call is
+           made on another thread, because that thread will try to acquire the
+           module-level lock *before* the handler-level lock, whereas this thread
+           tries to acquire the module-level lock *after* the handler-level lock
+           (because in this method, the handler-level lock has already been acquired).
+
 For a list of handlers included as standard, see :mod:`logging.handlers`.
 
 .. _formatter-objects: