mirror of https://github.com/python/cpython
Fix a race condition in test_asynchat uncovered by the Unladen Swallow JIT.
This commit is contained in:
parent
0dee9c1b5c
commit
2227251a4e
|
@ -21,6 +21,9 @@ class echo_server(threading.Thread):
|
||||||
self.event = event
|
self.event = event
|
||||||
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||||
self.port = test_support.bind_port(self.sock)
|
self.port = test_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):
|
def run(self):
|
||||||
self.sock.listen(1)
|
self.sock.listen(1)
|
||||||
|
@ -37,6 +40,9 @@ class echo_server(threading.Thread):
|
||||||
# remove the SERVER_QUIT message
|
# remove the SERVER_QUIT message
|
||||||
self.buffer = self.buffer.replace(SERVER_QUIT, '')
|
self.buffer = self.buffer.replace(SERVER_QUIT, '')
|
||||||
|
|
||||||
|
if self.start_resend_event:
|
||||||
|
self.start_resend_event.wait()
|
||||||
|
|
||||||
# re-send entire set of collected data
|
# re-send entire set of collected data
|
||||||
try:
|
try:
|
||||||
# this may fail on some tests, such as test_close_when_done, since
|
# this may fail on some tests, such as test_close_when_done, since
|
||||||
|
@ -202,11 +208,18 @@ class TestAsynchat(unittest.TestCase):
|
||||||
|
|
||||||
def test_close_when_done(self):
|
def test_close_when_done(self):
|
||||||
s, event = start_echo_server()
|
s, event = start_echo_server()
|
||||||
|
s.start_resend_event = threading.Event()
|
||||||
c = echo_client('\n', s.port)
|
c = echo_client('\n', s.port)
|
||||||
c.push("hello world\nI'm not dead yet!\n")
|
c.push("hello world\nI'm not dead yet!\n")
|
||||||
c.push(SERVER_QUIT)
|
c.push(SERVER_QUIT)
|
||||||
c.close_when_done()
|
c.close_when_done()
|
||||||
asyncore.loop(use_poll=self.usepoll, count=300, timeout=.01)
|
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()
|
s.join()
|
||||||
|
|
||||||
self.assertEqual(c.contents, [])
|
self.assertEqual(c.contents, [])
|
||||||
|
|
Loading…
Reference in New Issue