Issue #9945: logging: backported locking fixes from py3k.

This commit is contained in:
Vinay Sajip 2010-09-27 21:46:14 +00:00
parent af08f93523
commit 3ab905f17b
1 changed files with 39 additions and 37 deletions

View File

@ -1180,20 +1180,23 @@ class Logger(Filterer):
"""
Add the specified handler to this logger.
"""
_acquireLock()
try:
if not (hdlr in self.handlers):
self.handlers.append(hdlr)
finally:
_releaseLock()
def removeHandler(self, hdlr):
"""
Remove the specified handler from this logger.
"""
if hdlr in self.handlers:
#hdlr.close()
hdlr.acquire()
_acquireLock()
try:
if hdlr in self.handlers:
self.handlers.remove(hdlr)
finally:
hdlr.release()
_releaseLock()
def callHandlers(self, record):
"""
@ -1389,6 +1392,10 @@ def basicConfig(**kwargs):
using sys.stdout or sys.stderr), whereas FileHandler closes its stream
when the handler is closed.
"""
# Add thread safety in case someone mistakenly calls
# basicConfig() from multiple threads
_acquireLock()
try:
if len(root.handlers) == 0:
filename = kwargs.get("filename")
if filename:
@ -1404,11 +1411,9 @@ def basicConfig(**kwargs):
root.addHandler(hdlr)
level = kwargs.get("level")
if level is not None:
if str(level) == level: # If a string was passed, do more checks
if level not in _levelNames:
raise ValueError("Unknown level: %r" % level)
level = _levelNames[level]
root.setLevel(level)
finally:
_releaseLock()
#---------------------------------------------------------------------------
# Utility functions at module level.
@ -1426,15 +1431,6 @@ def getLogger(name=None):
else:
return root
#def getRootLogger():
# """
# Return the root logger.
#
# Note that getLogger('') now does the same thing, so this function is
# deprecated and may disappear in the future.
# """
# return root
def critical(msg, *args, **kwargs):
"""
Log a message with severity 'CRITICAL' on the root logger.
@ -1543,9 +1539,15 @@ class NullHandler(Handler):
a NullHandler and add it to the top-level logger of the library module or
package.
"""
def handle(self, record):
pass
def emit(self, record):
pass
def createLock(self):
self.lock = None
# Warnings integration
_warnings_showwarning = None