mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
Issue #23865: close() methods in multiple modules now are idempotent and more
robust at shutdown. If needs to release multiple resources, they are released even if errors are occured.
This commit is contained in:
parent
842f00e725
commit
7e7a3dba5f
27 changed files with 299 additions and 197 deletions
|
@ -1011,14 +1011,19 @@ class FileHandler(StreamHandler):
|
|||
"""
|
||||
self.acquire()
|
||||
try:
|
||||
if self.stream:
|
||||
self.flush()
|
||||
if hasattr(self.stream, "close"):
|
||||
self.stream.close()
|
||||
self.stream = None
|
||||
# Issue #19523: call unconditionally to
|
||||
# prevent a handler leak when delay is set
|
||||
StreamHandler.close(self)
|
||||
try:
|
||||
if self.stream:
|
||||
try:
|
||||
self.flush()
|
||||
finally:
|
||||
stream = self.stream
|
||||
self.stream = None
|
||||
if hasattr(stream, "close"):
|
||||
stream.close()
|
||||
finally:
|
||||
# Issue #19523: call unconditionally to
|
||||
# prevent a handler leak when delay is set
|
||||
StreamHandler.close(self)
|
||||
finally:
|
||||
self.release()
|
||||
|
||||
|
|
|
@ -627,9 +627,10 @@ class SocketHandler(logging.Handler):
|
|||
"""
|
||||
self.acquire()
|
||||
try:
|
||||
if self.sock:
|
||||
self.sock.close()
|
||||
sock = self.sock
|
||||
if sock:
|
||||
self.sock = None
|
||||
sock.close()
|
||||
logging.Handler.close(self)
|
||||
finally:
|
||||
self.release()
|
||||
|
@ -1213,8 +1214,10 @@ class BufferingHandler(logging.Handler):
|
|||
|
||||
This version just flushes and chains to the parent class' close().
|
||||
"""
|
||||
self.flush()
|
||||
logging.Handler.close(self)
|
||||
try:
|
||||
self.flush()
|
||||
finally:
|
||||
logging.Handler.close(self)
|
||||
|
||||
class MemoryHandler(BufferingHandler):
|
||||
"""
|
||||
|
@ -1268,13 +1271,15 @@ class MemoryHandler(BufferingHandler):
|
|||
"""
|
||||
Flush, set the target to None and lose the buffer.
|
||||
"""
|
||||
self.flush()
|
||||
self.acquire()
|
||||
try:
|
||||
self.target = None
|
||||
BufferingHandler.close(self)
|
||||
self.flush()
|
||||
finally:
|
||||
self.release()
|
||||
self.acquire()
|
||||
try:
|
||||
self.target = None
|
||||
BufferingHandler.close(self)
|
||||
finally:
|
||||
self.release()
|
||||
|
||||
|
||||
class QueueHandler(logging.Handler):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue