Commit 9f2f8333 authored by Josiah Carlson's avatar Josiah Carlson

Fixed bugs 760475, 953599, and 1519. This is a translation of changelist 64768

to the py3k branch.
parent 35bf9bf6
...@@ -77,7 +77,7 @@ class async_chat (asyncore.dispatcher): ...@@ -77,7 +77,7 @@ class async_chat (asyncore.dispatcher):
use_encoding = 0 use_encoding = 0
encoding = 'latin1' encoding = 'latin1'
def __init__ (self, conn=None): def __init__ (self, sock=None, map=None):
# for string terminator matching # for string terminator matching
self.ac_in_buffer = b'' self.ac_in_buffer = b''
...@@ -92,7 +92,7 @@ class async_chat (asyncore.dispatcher): ...@@ -92,7 +92,7 @@ class async_chat (asyncore.dispatcher):
# we toss the use of the "simple producer" and replace it with # we toss the use of the "simple producer" and replace it with
# a pure deque, which the original fifo was a wrapping of # a pure deque, which the original fifo was a wrapping of
self.producer_fifo = deque() self.producer_fifo = deque()
asyncore.dispatcher.__init__ (self, conn) asyncore.dispatcher.__init__ (self, sock, map)
def collect_incoming_data(self, data): def collect_incoming_data(self, data):
raise NotImplementedError("must be implemented in subclass") raise NotImplementedError("must be implemented in subclass")
......
...@@ -98,8 +98,10 @@ def readwrite(obj, flags): ...@@ -98,8 +98,10 @@ def readwrite(obj, flags):
obj.handle_read_event() obj.handle_read_event()
if flags & select.POLLOUT: if flags & select.POLLOUT:
obj.handle_write_event() obj.handle_write_event()
if flags & (select.POLLERR | select.POLLHUP | select.POLLNVAL): if flags & (select.POLLERR | select.POLLNVAL):
obj.handle_expt_event() obj.handle_expt_event()
if flags & select.POLLHUP:
obj.handle_close_event()
except (ExitNow, KeyboardInterrupt, SystemExit): except (ExitNow, KeyboardInterrupt, SystemExit):
raise raise
except: except:
...@@ -466,7 +468,7 @@ class dispatcher: ...@@ -466,7 +468,7 @@ class dispatcher:
), ),
'error' 'error'
) )
self.close() self.handle_close()
def handle_expt(self): def handle_expt(self):
self.log_info('unhandled exception', 'warning') self.log_info('unhandled exception', 'warning')
......
...@@ -39,6 +39,7 @@ class exitingdummy: ...@@ -39,6 +39,7 @@ class exitingdummy:
raise asyncore.ExitNow() raise asyncore.ExitNow()
handle_write_event = handle_read_event handle_write_event = handle_read_event
handle_close_event = handle_read_event
handle_expt_event = handle_read_event handle_expt_event = handle_read_event
class crashingdummy: class crashingdummy:
...@@ -49,6 +50,7 @@ class crashingdummy: ...@@ -49,6 +50,7 @@ class crashingdummy:
raise Exception() raise Exception()
handle_write_event = handle_read_event handle_write_event = handle_read_event
handle_close_event = handle_read_event
handle_expt_event = handle_read_event handle_expt_event = handle_read_event
def handle_error(self): def handle_error(self):
...@@ -118,6 +120,7 @@ class HelperFunctionTests(unittest.TestCase): ...@@ -118,6 +120,7 @@ class HelperFunctionTests(unittest.TestCase):
def __init__(self): def __init__(self):
self.read = False self.read = False
self.write = False self.write = False
self.closed = False
self.expt = False self.expt = False
def handle_read_event(self): def handle_read_event(self):
...@@ -126,6 +129,9 @@ class HelperFunctionTests(unittest.TestCase): ...@@ -126,6 +129,9 @@ class HelperFunctionTests(unittest.TestCase):
def handle_write_event(self): def handle_write_event(self):
self.write = True self.write = True
def handle_close_event(self):
self.closed = True
def handle_expt_event(self): def handle_expt_event(self):
self.expt = True self.expt = True
...@@ -168,9 +174,9 @@ class HelperFunctionTests(unittest.TestCase): ...@@ -168,9 +174,9 @@ class HelperFunctionTests(unittest.TestCase):
for flag in (select.POLLERR, select.POLLHUP, select.POLLNVAL): for flag in (select.POLLERR, select.POLLHUP, select.POLLNVAL):
tobj = testobj() tobj = testobj()
self.assertEqual(tobj.expt, False) self.assertEqual((tobj.expt, tobj.closed)[flag == select.POLLHUP], False)
asyncore.readwrite(tobj, flag) 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 # check that ExitNow exceptions in the object handler method
# bubbles all the way up through asyncore readwrite calls # bubbles all the way up through asyncore readwrite calls
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment