Add python-eventlet 0.16.1
[packages/trusty/python-eventlet.git] / eventlet / eventlet / hubs / epolls.py
1 import errno
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'):
7     epoll = select.epoll
8 else:
9     try:
10         # http://pypi.python.org/pypi/select26/
11         from select26 import epoll
12     except ImportError:
13         try:
14             import epoll as _epoll_mod
15         except ImportError:
16             raise ImportError(
17                 "No epoll implementation found in select module or PYTHONPATH")
18         else:
19             if hasattr(_epoll_mod, 'poll'):
20                 epoll = _epoll_mod.poll
21             else:
22                 raise ImportError(
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.")
27
28 from eventlet.hubs.hub import BaseHub
29 from eventlet.hubs import poll
30 from eventlet.hubs.poll import READ, WRITE
31
32 # NOTE: we rely on the fact that the epoll flag constants
33 # are identical in value to the poll constants
34
35
36 class Hub(poll.Hub):
37     def __init__(self, clock=time.time):
38         BaseHub.__init__(self, clock)
39         self.poll = epoll()
40         try:
41             # modify is required by select.epoll
42             self.modify = self.poll.modify
43         except AttributeError:
44             self.modify = self.poll.register
45
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)
50         try:
51             if not oldlisteners:
52                 # Means we've added a new listener
53                 self.register(fileno, new=True)
54             else:
55                 self.register(fileno, new=False)
56         except IOError as ex:    # ignore EEXIST, #80
57             if get_errno(ex) != errno.EEXIST:
58                 raise
59         return listener
60
61     def do_poll(self, seconds):
62         return self.poll.poll(seconds)