mirror of
https://github.com/python/cpython.git
synced 2025-12-04 00:30:19 +00:00
Fixed bugs 760475, 953599, and 1519. This is a translation of changelist 64768
to the py3k branch.
This commit is contained in:
parent
35bf9bf68c
commit
9f2f83338f
3 changed files with 14 additions and 6 deletions
|
|
@ -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):
|
||||||
# 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):
|
||||||
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:
|
||||||
),
|
),
|
||||||
'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:
|
||||||
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:
|
||||||
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):
|
||||||
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):
|
||||||
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):
|
||||||
|
|
||||||
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
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue