Ignoring EEXIST in epoll hub on register. Should fix #80.
This commit is contained in:
@@ -44,11 +44,15 @@ class Hub(poll.Hub):
|
||||
oldlisteners = bool(self.listeners[READ].get(fileno) or
|
||||
self.listeners[WRITE].get(fileno))
|
||||
listener = BaseHub.add(self, evtype, fileno, cb)
|
||||
if not oldlisteners:
|
||||
# Means we've added a new listener
|
||||
self.register(fileno, new=True)
|
||||
else:
|
||||
self.register(fileno, new=False)
|
||||
try:
|
||||
if not oldlisteners:
|
||||
# Means we've added a new listener
|
||||
self.register(fileno, new=True)
|
||||
else:
|
||||
self.register(fileno, new=False)
|
||||
except IOError, ex: # ignore EEXIST, #80
|
||||
if get_errno(ex) != errno.EEXIST:
|
||||
raise
|
||||
return listener
|
||||
|
||||
def do_poll(self, seconds):
|
||||
|
@@ -213,6 +213,42 @@ class TestBadFilenos(LimitedTestCase):
|
||||
from eventlet.green import select
|
||||
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):
|
||||
|
Reference in New Issue
Block a user