Skip to content

Commit 3f0fc1e

Browse files
authored
Merge pull request #20 from tiagocoutinho/main
Use `epoll` for `Bus.wait()` when available
2 parents 5e71299 + d1f5c44 commit 3f0fc1e

File tree

1 file changed

+15
-2
lines changed

1 file changed

+15
-2
lines changed

magicbus/base.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@
1717
import select
1818
except ImportError:
1919
select = None
20+
else:
21+
try:
22+
epoll = select.epoll
23+
except AttributeError:
24+
epoll = None
2025
import sys
2126
import time
2227
import traceback as _traceback
@@ -333,14 +338,20 @@ def wait(self, state, interval=0.1, channel=None, sleep=False):
333338
pipe = os.pipe()
334339
read_fd, write_fd = pipe
335340
self._state_transition_pipes.add(pipe)
341+
if epoll:
342+
poller = epoll(1)
343+
poller.register(read_fd, select.EPOLLIN)
336344

337345
def _wait():
338346
try:
339347
while self.state not in _states_to_wait_for:
340348
if select:
341349
try:
342-
r, w, x = select.select([read_fd], [], [], interval)
343-
if r:
350+
if epoll:
351+
readers = poller.poll(interval)
352+
else:
353+
readers = select.select([read_fd], [], [], interval)[0]
354+
if readers:
344355
os.read(read_fd, 1)
345356
except (select.error, OSError):
346357
# Interrupted due to a signal (being handled by some
@@ -352,6 +363,8 @@ def _wait():
352363
self.publish(channel)
353364
finally:
354365
self._state_transition_pipes.discard(pipe)
366+
if epoll:
367+
poller.close()
355368
# NOTE: Closing the write file descriptor first
356369
# NOTE: to prevent "Broken pipe" in `self._transition()`.
357370
os.close(write_fd)

0 commit comments

Comments
 (0)