Skip to content

Commit

Permalink
Ignoring EEXIST in epoll hub on register. Should fix eventlet#80.
Browse files Browse the repository at this point in the history
  • Loading branch information
rdw committed Apr 3, 2011
1 parent 18adbba commit 2dd4148
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 5 deletions.
14 changes: 9 additions & 5 deletions eventlet/hubs/epolls.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,11 +44,15 @@ def add(self, evtype, fileno, cb):
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):
Expand Down
36 changes: 36 additions & 0 deletions tests/hub_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,42 @@ def test_repeated_selects(self):
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):
Expand Down

0 comments on commit 2dd4148

Please sign in to comment.