42 lines
1.4 KiB
Python
42 lines
1.4 KiB
Python
from eventlet import patcher
|
|
time = patcher.original('time')
|
|
try:
|
|
# shoot for epoll module first
|
|
from epoll import poll as epoll
|
|
except ImportError, e:
|
|
# if we can't import that, hope we're on 2.6
|
|
select = patcher.original('select')
|
|
try:
|
|
epoll = select.epoll
|
|
except AttributeError:
|
|
raise ImportError("No epoll on select module")
|
|
|
|
from eventlet.hubs.hub import BaseHub
|
|
from eventlet.hubs import poll
|
|
from eventlet.hubs.poll import READ, WRITE
|
|
|
|
# NOTE: we rely on the fact that the epoll flag constants
|
|
# are identical in value to the poll constants
|
|
|
|
class Hub(poll.Hub):
|
|
WAIT_MULTIPLIER = 1.0 # epoll.poll's timeout is measured in seconds
|
|
def __init__(self, clock=time.time):
|
|
BaseHub.__init__(self, clock)
|
|
self.poll = epoll()
|
|
try:
|
|
# modify is required by select.epoll
|
|
self.modify = self.poll.modify
|
|
except AttributeError:
|
|
self.modify = self.poll.register
|
|
|
|
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)
|
|
return listener
|