Merged revisions 79038 via svnmerge from

svn+ssh://pythondev@svn.python.org/python/trunk

........
  r79038 | collin.winter | 2010-03-17 15:36:26 -0700 (Wed, 17 Mar 2010) | 2 lines

  Fix a race condition in test_asynchat uncovered by the Unladen Swallow JIT.
........
This commit is contained in:
Collin Winter 2010-03-17 23:49:15 +00:00
parent 254807816c
commit 8641c562e3
1 changed files with 13 additions and 0 deletions

View File

@ -22,6 +22,9 @@ class echo_server(threading.Thread):
self.event = event
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.port = support.bind_port(self.sock)
# This will be set if the client wants us to wait before echoing data
# back.
self.start_resend_event = None
def run(self):
self.sock.listen(1)
@ -38,6 +41,9 @@ class echo_server(threading.Thread):
# remove the SERVER_QUIT message
self.buffer = self.buffer.replace(SERVER_QUIT, b'')
if self.start_resend_event:
self.start_resend_event.wait()
# re-send entire set of collected data
try:
# this may fail on some tests, such as test_close_when_done, since
@ -203,11 +209,18 @@ class TestAsynchat(unittest.TestCase):
def test_close_when_done(self):
s, event = start_echo_server()
s.start_resend_event = threading.Event()
c = echo_client(b'\n', s.port)
c.push(b"hello world\nI'm not dead yet!\n")
c.push(SERVER_QUIT)
c.close_when_done()
asyncore.loop(use_poll=self.usepoll, count=300, timeout=.01)
# Only allow the server to start echoing data back to the client after
# the client has closed its connection. This prevents a race condition
# where the server echoes all of its data before we can check that it
# got any down below.
s.start_resend_event.set()
s.join()
self.assertEqual(c.contents, [])