From 4353de6e857cd96616b2cdbebca7ff949c216bd3 Mon Sep 17 00:00:00 2001 From: Ryan Williams Date: Tue, 25 May 2010 12:03:18 -0700 Subject: [PATCH] Fixed behavior on suspend, thanks to Michael Carter for identifying the problem. --- eventlet/hubs/poll.py | 2 +- tests/hub_test.py | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/eventlet/hubs/poll.py b/eventlet/hubs/poll.py index 890ff50..270ec0c 100644 --- a/eventlet/hubs/poll.py +++ b/eventlet/hubs/poll.py @@ -76,7 +76,7 @@ class Hub(BaseHub): return try: presult = self.do_poll(seconds) - except select.error, e: + except (IOError, select.error), e: if get_errno(e) == errno.EINTR: return raise diff --git a/tests/hub_test.py b/tests/hub_test.py index 22526f3..91fbbd8 100644 --- a/tests/hub_test.py +++ b/tests/hub_test.py @@ -143,6 +143,42 @@ class TestHubSelection(LimitedTestCase): +class TestSuspend(LimitedTestCase): + TEST_TIMEOUT=3 + def test_suspend_doesnt_crash(self): + import errno + import os + import shutil + import signal + import subprocess + import sys + import tempfile + self.tempdir = tempfile.mkdtemp('test_suspend') + filename = os.path.join(self.tempdir, 'test_suspend.py') + fd = open(filename, "w") + fd.write("""import eventlet +eventlet.Timeout(0.5) +try: + eventlet.listen(("127.0.0.1", 0)).accept() +except eventlet.Timeout: + print "exited correctly" +""") + fd.close() + python_path = os.pathsep.join(sys.path + [self.tempdir]) + new_env = os.environ.copy() + new_env['PYTHONPATH'] = python_path + p = subprocess.Popen([sys.executable, + os.path.join(self.tempdir, filename)], + stdout=subprocess.PIPE, stderr=subprocess.STDOUT, env=new_env) + eventlet.sleep(0.4) # wait for process to hit accept + p.send_signal(signal.SIGSTOP) # suspend and resume to generate EINTR + p.send_signal(signal.SIGCONT) + output, _ = p.communicate() + lines = [l for l in output.split("\n") if l] + self.assert_("exited correctly" in lines[-1]) + shutil.rmtree(self.tempdir) + + class Foo(object): pass