Revision 565fe4c4
b/lib/daemon.py | ||
---|---|---|
41 | 41 |
|
42 | 42 |
""" |
43 | 43 |
self._io_wait = {} |
44 |
self._io_wait_add = [] |
|
45 |
self._io_wait_remove = [] |
|
46 | 44 |
self._signal_wait = [] |
45 |
self._poller = select.poll() |
|
47 | 46 |
|
48 | 47 |
def Run(self, handle_sigchld=True, handle_sigterm=True, stop_on_empty=False): |
49 | 48 |
"""Runs the mainloop. |
... | ... | |
57 | 56 |
unregistered |
58 | 57 |
|
59 | 58 |
""" |
60 |
poller = select.poll() |
|
61 |
|
|
62 | 59 |
# Setup signal handlers |
63 | 60 |
if handle_sigchld: |
64 | 61 |
sigchld_handler = utils.SignalHandler([signal.SIGCHLD]) |
... | ... | |
75 | 72 |
|
76 | 73 |
# Start actual main loop |
77 | 74 |
while running: |
78 |
# Entries could be added again afterwards, hence removing first |
|
79 |
if self._io_wait_remove: |
|
80 |
for fd in self._io_wait_remove: |
|
81 |
try: |
|
82 |
poller.unregister(fd) |
|
83 |
except KeyError: |
|
84 |
pass |
|
85 |
try: |
|
86 |
del self._io_wait[fd] |
|
87 |
except KeyError: |
|
88 |
pass |
|
89 |
self._io_wait_remove = [] |
|
90 |
|
|
91 |
# Add new entries |
|
92 |
if self._io_wait_add: |
|
93 |
for (owner, fd, conditions) in self._io_wait_add: |
|
94 |
self._io_wait[fd] = owner |
|
95 |
poller.register(fd, conditions) |
|
96 |
self._io_wait_add = [] |
|
97 |
|
|
98 | 75 |
# Stop if nothing is listening anymore |
99 | 76 |
if stop_on_empty and not (self._io_wait): |
100 | 77 |
break |
101 | 78 |
|
102 | 79 |
# Wait for I/O events |
103 | 80 |
try: |
104 |
io_events = poller.poll(None) |
|
81 |
io_events = self._poller.poll(None)
|
|
105 | 82 |
except select.error, err: |
106 | 83 |
# EINTR can happen when signals are sent |
107 | 84 |
if err.args and err.args[0] in (errno.EINTR,): |
... | ... | |
161 | 138 |
assert isinstance(fd, (int, long)), \ |
162 | 139 |
"Only integers are supported for file descriptors" |
163 | 140 |
|
164 |
self._io_wait_add.append((owner, fd, condition)) |
|
165 |
|
|
166 |
def UnregisterIO(self, fd): |
|
167 |
"""Unregister a file descriptor. |
|
168 |
|
|
169 |
It'll be unregistered the next time the mainloop checks for it. |
|
170 |
|
|
171 |
@type fd: int |
|
172 |
@param fd: File descriptor |
|
173 |
|
|
174 |
""" |
|
175 |
# select.Poller also supports file() like objects, but we don't. |
|
176 |
assert isinstance(fd, (int, long)), \ |
|
177 |
"Only integers are supported for file descriptors" |
|
178 |
|
|
179 |
self._io_wait_remove.append(fd) |
|
141 |
self._io_wait[fd] = owner |
|
142 |
self._poller.register(fd, condition) |
|
180 | 143 |
|
181 | 144 |
def RegisterSignal(self, owner): |
182 | 145 |
"""Registers a receiver for signal notifications |
Also available in: Unified diff