Ignoring EEXIST in epoll hub on register. Should fix #80.

This commit is contained in:
Ryan Williams
2011-04-02 17:16:07 -07:00
parent 18adbba35e
commit 2dd4148f2c
2 changed files with 45 additions and 5 deletions

View File

@@ -44,11 +44,15 @@ class Hub(poll.Hub):
oldlisteners = bool(self.listeners[READ].get(fileno) or oldlisteners = bool(self.listeners[READ].get(fileno) or
self.listeners[WRITE].get(fileno)) self.listeners[WRITE].get(fileno))
listener = BaseHub.add(self, evtype, fileno, cb) listener = BaseHub.add(self, evtype, fileno, cb)
if not oldlisteners: try:
# Means we've added a new listener if not oldlisteners:
self.register(fileno, new=True) # Means we've added a new listener
else: self.register(fileno, new=True)
self.register(fileno, new=False) else:
self.register(fileno, new=False)
except IOError, ex: # ignore EEXIST, #80
if get_errno(ex) != errno.EEXIST:
raise
return listener return listener
def do_poll(self, seconds): def do_poll(self, seconds):

View File

@@ -215,6 +215,42 @@ class TestBadFilenos(LimitedTestCase):
self.assertRaises(ValueError, select.select, [-1], [], []) self.assertRaises(ValueError, select.select, [-1], [], [])
from tests.patcher_test import ProcessBase
class TestFork(ProcessBase):
@skip_with_pyevent
@skip_with_zmq
def test_fork(self):
new_mod = """
import os
import eventlet
server = eventlet.listen(('localhost', 12345))
t = eventlet.Timeout(0.01)
try:
new_sock, address = server.accept()
except eventlet.Timeout, t:
pass
pid = os.fork()
if not pid:
t = eventlet.Timeout(0.1)
try:
new_sock, address = server.accept()
except eventlet.Timeout, t:
print "accept blocked"
else:
kpid, status = os.wait()
assert kpid == pid
assert status == 0
print "child died ok"
"""
self.write_to_tempfile("newmod", new_mod)
output, lines = self.launch_subprocess('newmod.py')
self.assertEqual(len(lines), 3, output)
self.assert_("accept blocked" in lines[0])
self.assert_("child died ok" in lines[1])
class Foo(object): class Foo(object):
pass pass