(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:
Victor Stinner 2014-06-27 23:57:19 +02:00
commit a81088ae12
3 changed files with 28 additions and 0 deletions

View File

@ -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

View File

@ -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):

View File

@ -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