Skip to content

Commit f4618db

Browse files
committed
Use epoll for Bus.wait() when available
1 parent 5e71299 commit f4618db

File tree

1 file changed

+14
-2
lines changed

1 file changed

+14
-2
lines changed

magicbus/base.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@
1515
import random
1616
try:
1717
import select
18+
try:
19+
epoll = select.epoll
20+
except AttributeError:
21+
epoll = None
1822
except ImportError:
1923
select = None
2024
import sys
@@ -333,14 +337,20 @@ def wait(self, state, interval=0.1, channel=None, sleep=False):
333337
pipe = os.pipe()
334338
read_fd, write_fd = pipe
335339
self._state_transition_pipes.add(pipe)
340+
if epoll:
341+
poller = epoll(1)
342+
poller.register(read_fd, select.EPOLLIN)
336343

337344
def _wait():
338345
try:
339346
while self.state not in _states_to_wait_for:
340347
if select:
341348
try:
342-
r, w, x = select.select([read_fd], [], [], interval)
343-
if r:
349+
if epoll:
350+
readers = poller.poll(interval)
351+
else:
352+
readers = select.select([read_fd], [], [], interval)[0]
353+
if readers:
344354
os.read(read_fd, 1)
345355
except (select.error, OSError):
346356
# Interrupted due to a signal (being handled by some
@@ -352,6 +362,8 @@ def _wait():
352362
self.publish(channel)
353363
finally:
354364
self._state_transition_pipes.discard(pipe)
365+
if epoll:
366+
poller.close()
355367
# NOTE: Closing the write file descriptor first
356368
# NOTE: to prevent "Broken pipe" in `self._transition()`.
357369
os.close(write_fd)

0 commit comments

Comments
 (0)