(Merge 3.4) Issue #11453: asyncore: emit a ResourceWarning when an unclosed
file_wrapper object is destroyed. The destructor now closes the file if needed. The close() method can now be called twice: the second call does nothing.
This commit is contained in:
commit
a81088ae12
|
@ -600,6 +600,11 @@ if os.name == 'posix':
|
||||||
def __init__(self, fd):
|
def __init__(self, fd):
|
||||||
self.fd = os.dup(fd)
|
self.fd = os.dup(fd)
|
||||||
|
|
||||||
|
def __del__(self):
|
||||||
|
if self.fd >= 0:
|
||||||
|
warnings.warn("unclosed file %r" % self, ResourceWarning)
|
||||||
|
self.close()
|
||||||
|
|
||||||
def recv(self, *args):
|
def recv(self, *args):
|
||||||
return os.read(self.fd, *args)
|
return os.read(self.fd, *args)
|
||||||
|
|
||||||
|
@ -618,7 +623,10 @@ if os.name == 'posix':
|
||||||
write = send
|
write = send
|
||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
|
if self.fd < 0:
|
||||||
|
return
|
||||||
os.close(self.fd)
|
os.close(self.fd)
|
||||||
|
self.fd = -1
|
||||||
|
|
||||||
def fileno(self):
|
def fileno(self):
|
||||||
return self.fd
|
return self.fd
|
||||||
|
|
|
@ -413,6 +413,22 @@ class FileWrapperTest(unittest.TestCase):
|
||||||
asyncore.loop(timeout=0.01, use_poll=True, count=2)
|
asyncore.loop(timeout=0.01, use_poll=True, count=2)
|
||||||
self.assertEqual(b"".join(data), self.d)
|
self.assertEqual(b"".join(data), self.d)
|
||||||
|
|
||||||
|
def test_resource_warning(self):
|
||||||
|
# Issue #11453
|
||||||
|
fd = os.open(support.TESTFN, os.O_RDONLY)
|
||||||
|
f = asyncore.file_wrapper(fd)
|
||||||
|
with support.check_warnings(('', ResourceWarning)):
|
||||||
|
f = None
|
||||||
|
support.gc_collect()
|
||||||
|
|
||||||
|
def test_close_twice(self):
|
||||||
|
fd = os.open(support.TESTFN, os.O_RDONLY)
|
||||||
|
f = asyncore.file_wrapper(fd)
|
||||||
|
f.close()
|
||||||
|
self.assertEqual(f.fd, -1)
|
||||||
|
# calling close twice should not fail
|
||||||
|
f.close()
|
||||||
|
|
||||||
|
|
||||||
class BaseTestHandler(asyncore.dispatcher):
|
class BaseTestHandler(asyncore.dispatcher):
|
||||||
|
|
||||||
|
|
|
@ -103,6 +103,10 @@ Core and Builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue #11453: asyncore: emit a ResourceWarning when an unclosed file_wrapper
|
||||||
|
object is destroyed. The destructor now closes the file if needed. The
|
||||||
|
close() method can now be called twice: the second call does nothing.
|
||||||
|
|
||||||
- Issue #21858: Better handling of Python exceptions in the sqlite3 module.
|
- Issue #21858: Better handling of Python exceptions in the sqlite3 module.
|
||||||
|
|
||||||
- Issue #21476: Make sure the email.parser.BytesParser TextIOWrapper is
|
- Issue #21476: Make sure the email.parser.BytesParser TextIOWrapper is
|
||||||
|
|
Loading…
Reference in New Issue