This repository was archived by the owner on Aug 26, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmultiplex.py
More file actions
91 lines (75 loc) · 2.71 KB
/
multiplex.py
File metadata and controls
91 lines (75 loc) · 2.71 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
from select import *
LM_TIMER = 1
LM_READ = 2
LM_WRITE = 3
LM_RESET = 4
class _Multiplexer:
def schedule_read(self):
raise NotImplementedError
def deschedule_read(self):
raise NotImplementedError
def schedule_write(self):
raise NotImplementedError
def deschedule_write(self):
raise NotImplementedError
def schedule_timer(self):
raise NotImplementedError
def deschedule_timer(self):
raise NotImplementedError
def get_events(self):
raise NotImplementedError
class Event:
def __init__(self, filter, fd, data):
self.fd, self.filter, self.data = (fd, filter, data)
def __str__(self):
return 'fd: %s filter: %s data: %s' % (self.fd, self.filter, self.data)
class _KQueue(_Multiplexer):
def __init__(self):
self._events = []
self._fd_handle = kqueue()
def _generate_events(self):
"""Generates an array of kevent filters to pass it to kqueue control."""
new_list = []
# ident, flags, filter
for fd, flags, filter,data, udata in self._events:
new_list.append(kevent(fd, flags=KQ_EV_ENABLE|flags,
filter=filter, data=data, udata=udata))
self._events = []
return new_list
def get_events(self):
elist = self._generate_events()
events = self._fd_handle.control(elist, 50, 3)
results = []
for e in events:
if e.flags & KQ_EV_EOF == KQ_EV_EOF:
results.append(Event(LM_RESET, e.ident, 0))
elif e.filter == KQ_FILTER_TIMER:
results.append(Event(LM_TIMER, e.udata, 0))
elif e.filter == KQ_FILTER_WRITE:
results.append(Event(LM_WRITE, e.ident, e.data))
elif e.filter == KQ_FILTER_READ:
results.append(Event(LM_READ, e.ident, e.data))
return results
def schedule_read(self, fd, data=0):
self._events.append((fd, KQ_EV_ADD, KQ_FILTER_READ, data, 0))
def deschedule_read(self):
pass
def schedule_write(self, fd):
self._events.append((fd, KQ_EV_ADD, KQ_FILTER_WRITE, 0, 0))
def deschedule_write(self, fd):
self._events.append((fd, KQ_EV_DELETE, KQ_FILTER_WRITE, 0, 0))
def schedule_timer(self, fd, timeout):
self._events.append((1, KQ_EV_ENABLE | KQ_EV_ADD | KQ_EV_ONESHOT,
KQ_FILTER_TIMER, timeout, fd))
def deschedule_timer(self, fd, timeout):
pass
#class _EPoll(_Multiplexer):
# pass
#factory method to select the appropriate multiplexer based on the system.
def Multiplex():
for m in ('_KQueue', '_EPoll'):
try:
return globals().get(m)()
except Exception, e:
print e
return None