From ff5f42088bdbe9fe801a52ba3a9d63bbaacdf2a2 Mon Sep 17 00:00:00 2001 From: Josiah Carlson Date: Mon, 7 Jul 2008 04:51:46 +0000 Subject: [PATCH] Fixed bugs 760475, 953599, and 1519. --- Lib/asynchat.py | 4 ++-- Lib/asyncore.py | 6 ++++-- Lib/test/test_asyncore.py | 10 ++++++++-- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/Lib/asynchat.py b/Lib/asynchat.py index 1d5fb7f0308..8a7176d10c8 100644 --- a/Lib/asynchat.py +++ b/Lib/asynchat.py @@ -59,7 +59,7 @@ class async_chat (asyncore.dispatcher): ac_in_buffer_size = 4096 ac_out_buffer_size = 4096 - def __init__ (self, conn=None): + def __init__ (self, sock=None, map=None): # for string terminator matching self.ac_in_buffer = '' @@ -74,7 +74,7 @@ class async_chat (asyncore.dispatcher): # we toss the use of the "simple producer" and replace it with # a pure deque, which the original fifo was a wrapping of self.producer_fifo = deque() - asyncore.dispatcher.__init__ (self, conn) + asyncore.dispatcher.__init__ (self, sock, map) def collect_incoming_data(self, data): raise NotImplementedError("must be implemented in subclass") diff --git a/Lib/asyncore.py b/Lib/asyncore.py index 305d8957dea..e06b3b461c9 100644 --- a/Lib/asyncore.py +++ b/Lib/asyncore.py @@ -99,8 +99,10 @@ def readwrite(obj, flags): obj.handle_read_event() if flags & select.POLLOUT: obj.handle_write_event() - if flags & (select.POLLERR | select.POLLHUP | select.POLLNVAL): + if flags & (select.POLLERR | select.POLLNVAL): obj.handle_expt_event() + if flags & select.POLLHUP: + obj.handle_close_event() except (ExitNow, KeyboardInterrupt, SystemExit): raise except: @@ -467,7 +469,7 @@ class dispatcher: ), 'error' ) - self.close() + self.handle_close() def handle_expt(self): self.log_info('unhandled exception', 'warning') diff --git a/Lib/test/test_asyncore.py b/Lib/test/test_asyncore.py index 48797704f5b..36096ef6878 100644 --- a/Lib/test/test_asyncore.py +++ b/Lib/test/test_asyncore.py @@ -38,6 +38,7 @@ class exitingdummy: raise asyncore.ExitNow() handle_write_event = handle_read_event + handle_close_event = handle_read_event handle_expt_event = handle_read_event class crashingdummy: @@ -48,6 +49,7 @@ class crashingdummy: raise Exception() handle_write_event = handle_read_event + handle_close_event = handle_read_event handle_expt_event = handle_read_event def handle_error(self): @@ -117,6 +119,7 @@ class HelperFunctionTests(unittest.TestCase): def __init__(self): self.read = False self.write = False + self.closed = False self.expt = False def handle_read_event(self): @@ -125,6 +128,9 @@ class HelperFunctionTests(unittest.TestCase): def handle_write_event(self): self.write = True + def handle_close_event(self): + self.closed = True + def handle_expt_event(self): self.expt = True @@ -167,9 +173,9 @@ class HelperFunctionTests(unittest.TestCase): for flag in (select.POLLERR, select.POLLHUP, select.POLLNVAL): tobj = testobj() - self.assertEqual(tobj.expt, False) + self.assertEqual((tobj.expt, tobj.closed)[flag == select.POLLHUP], False) asyncore.readwrite(tobj, flag) - self.assertEqual(tobj.expt, True) + self.assertEqual((tobj.expt, tobj.closed)[flag == select.POLLHUP], True) # check that ExitNow exceptions in the object handler method # bubbles all the way up through asyncore readwrite calls