summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJosiah Carlson <josiah.carlson@gmail.com>2008-07-07 05:04:12 (GMT)
committerJosiah Carlson <josiah.carlson@gmail.com>2008-07-07 05:04:12 (GMT)
commit9f2f83338f54a769497fd122e86170aa58cf5603 (patch)
tree525f6de8d461e6fe1d7c2824e1aa08b7e8d2a285
parent35bf9bf68cf70ead3f52c95a677cb27505dec9f9 (diff)
downloadcpython-9f2f83338f54a769497fd122e86170aa58cf5603.zip
cpython-9f2f83338f54a769497fd122e86170aa58cf5603.tar.gz
cpython-9f2f83338f54a769497fd122e86170aa58cf5603.tar.bz2
Fixed bugs 760475, 953599, and 1519. This is a translation of changelist 64768
to the py3k branch.
-rw-r--r--Lib/asynchat.py4
-rw-r--r--Lib/asyncore.py6
-rw-r--r--Lib/test/test_asyncore.py10
3 files changed, 14 insertions, 6 deletions
diff --git a/Lib/asynchat.py b/Lib/asynchat.py
index ae82cfa..6558512 100644
--- a/Lib/asynchat.py
+++ b/Lib/asynchat.py
@@ -77,7 +77,7 @@ class async_chat (asyncore.dispatcher):
use_encoding = 0
encoding = 'latin1'
- def __init__ (self, conn=None):
+ def __init__ (self, sock=None, map=None):
# for string terminator matching
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
# 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 e82d24b..586358c 100644
--- a/Lib/asyncore.py
+++ b/Lib/asyncore.py
@@ -98,8 +98,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:
@@ -466,7 +468,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 716368b..335bded 100644
--- a/Lib/test/test_asyncore.py
+++ b/Lib/test/test_asyncore.py
@@ -39,6 +39,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:
@@ -49,6 +50,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):
@@ -118,6 +120,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):
@@ -126,6 +129,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
@@ -168,9 +174,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