add event loop
This commit is contained in:
parent
2d3ecdeb4f
commit
6e7e689a24
2 changed files with 38 additions and 10 deletions
|
@ -29,6 +29,9 @@ import select
|
||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
|
|
||||||
|
|
||||||
|
__all__ = ['EventLoop', 'MODE_NULL', 'MODE_IN', 'MODE_OUT', 'MODE_ERR',
|
||||||
|
'MODE_HUP', 'MODE_NVAL']
|
||||||
|
|
||||||
MODE_NULL = 0x00
|
MODE_NULL = 0x00
|
||||||
MODE_IN = 0x01
|
MODE_IN = 0x01
|
||||||
MODE_OUT = 0x04
|
MODE_OUT = 0x04
|
||||||
|
@ -135,13 +138,37 @@ class SelectLoop(object):
|
||||||
self.add_fd(fd, mode)
|
self.add_fd(fd, mode)
|
||||||
|
|
||||||
|
|
||||||
EventLoop = None
|
class EventLoop(object):
|
||||||
|
def __init__(self):
|
||||||
|
if hasattr(select, 'epoll'):
|
||||||
|
self._impl = EpollLoop()
|
||||||
|
elif hasattr(select, 'kqueue'):
|
||||||
|
self._impl = KqueueLoop()
|
||||||
|
elif hasattr(select, 'select'):
|
||||||
|
self._impl = SelectLoop()
|
||||||
|
else:
|
||||||
|
raise Exception('can not find any available functions in select '
|
||||||
|
'package')
|
||||||
|
self._fd_to_f = defaultdict(list)
|
||||||
|
|
||||||
if hasattr(select, 'epoll'):
|
def poll(self, timeout=None):
|
||||||
EventLoop = EpollLoop
|
events = self._impl.poll(timeout)
|
||||||
elif hasattr(select, 'kqueue'):
|
return ((self._fd_to_f[fd], event) for fd, event in events)
|
||||||
EventLoop = KqueueLoop
|
|
||||||
elif hasattr(select, 'select'):
|
def add(self, f, mode):
|
||||||
EventLoop = SelectLoop
|
fd = f.fileno()
|
||||||
else:
|
self._fd_to_f[fd].append(f)
|
||||||
raise Exception('can not find any available functions in select package')
|
self._impl.add_fd(fd, mode)
|
||||||
|
|
||||||
|
def remove(self, f):
|
||||||
|
fd = f.fileno()
|
||||||
|
a = self._fd_to_f[fd]
|
||||||
|
if len(a) <= 1:
|
||||||
|
self._fd_to_f[fd] = None
|
||||||
|
else:
|
||||||
|
a.remove(f)
|
||||||
|
self._impl.remove_fd(fd)
|
||||||
|
|
||||||
|
def modify(self, f, mode):
|
||||||
|
fd = f.fileno()
|
||||||
|
self._impl.modify_fd(fd, mode)
|
||||||
|
|
|
@ -84,6 +84,7 @@ class UDPRelay(object):
|
||||||
self._timeout = timeout
|
self._timeout = timeout
|
||||||
self._is_local = is_local
|
self._is_local = is_local
|
||||||
self._eventloop = event.EventLoop()
|
self._eventloop = event.EventLoop()
|
||||||
|
self._cache = {} # TODO replace this dictionary with an LRU cache
|
||||||
|
|
||||||
def _handle_server(self, addr, sock, data):
|
def _handle_server(self, addr, sock, data):
|
||||||
# TODO
|
# TODO
|
||||||
|
@ -96,7 +97,7 @@ class UDPRelay(object):
|
||||||
def _run(self):
|
def _run(self):
|
||||||
eventloop = self._eventloop
|
eventloop = self._eventloop
|
||||||
server_socket = self._server_socket
|
server_socket = self._server_socket
|
||||||
eventloop.add_fd(server_socket, event.MODE_IN)
|
eventloop.add(server_socket, event.MODE_IN)
|
||||||
is_local = self._is_local
|
is_local = self._is_local
|
||||||
while True:
|
while True:
|
||||||
r = eventloop.poll()
|
r = eventloop.poll()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue