2 from eventlet.support import get_errno
3 from eventlet import patcher
4 time = patcher.original('time')
5 select = patcher.original("select")
6 if hasattr(select, 'epoll'):
10 # http://pypi.python.org/pypi/select26/
11 from select26 import epoll
14 import epoll as _epoll_mod
17 "No epoll implementation found in select module or PYTHONPATH")
19 if hasattr(_epoll_mod, 'poll'):
20 epoll = _epoll_mod.poll
23 "You have an old, buggy epoll module in PYTHONPATH."
24 " Install http://pypi.python.org/pypi/python-epoll/"
25 " NOT http://pypi.python.org/pypi/pyepoll/. "
26 " easy_install pyepoll installs the wrong version.")
28 from eventlet.hubs.hub import BaseHub
29 from eventlet.hubs import poll
30 from eventlet.hubs.poll import READ, WRITE
32 # NOTE: we rely on the fact that the epoll flag constants
33 # are identical in value to the poll constants
37 def __init__(self, clock=time.time):
38 BaseHub.__init__(self, clock)
41 # modify is required by select.epoll
42 self.modify = self.poll.modify
43 except AttributeError:
44 self.modify = self.poll.register
46 def add(self, evtype, fileno, cb, tb, mac):
47 oldlisteners = bool(self.listeners[READ].get(fileno) or
48 self.listeners[WRITE].get(fileno))
49 listener = BaseHub.add(self, evtype, fileno, cb, tb, mac)
52 # Means we've added a new listener
53 self.register(fileno, new=True)
55 self.register(fileno, new=False)
56 except IOError as ex: # ignore EEXIST, #80
57 if get_errno(ex) != errno.EEXIST:
61 def do_poll(self, seconds):
62 return self.poll.poll(seconds)