IO is never unregistered in our current usage, so dropping that functionality for now. Also putting the poller outside of the Run() function allows us to avoid the double step of adding tuples to an _io_wait_add queue and adding them later in the main loop.
Signed-off-by: Guido Trotter <ultrot...@google.com> --- lib/daemon.py | 45 ++++----------------------------------------- 1 files changed, 4 insertions(+), 41 deletions(-) diff --git a/lib/daemon.py b/lib/daemon.py index e363be3..b5fcb5d 100644 --- a/lib/daemon.py +++ b/lib/daemon.py @@ -41,9 +41,8 @@ class Mainloop(object): """ self._io_wait = {} - self._io_wait_add = [] - self._io_wait_remove = [] self._signal_wait = [] + self._poller = select.poll() def Run(self, handle_sigchld=True, handle_sigterm=True, stop_on_empty=False): """Runs the mainloop. @@ -57,8 +56,6 @@ class Mainloop(object): unregistered """ - poller = select.poll() - # Setup signal handlers if handle_sigchld: sigchld_handler = utils.SignalHandler([signal.SIGCHLD]) @@ -75,33 +72,13 @@ class Mainloop(object): # Start actual main loop while running: - # Entries could be added again afterwards, hence removing first - if self._io_wait_remove: - for fd in self._io_wait_remove: - try: - poller.unregister(fd) - except KeyError: - pass - try: - del self._io_wait[fd] - except KeyError: - pass - self._io_wait_remove = [] - - # Add new entries - if self._io_wait_add: - for (owner, fd, conditions) in self._io_wait_add: - self._io_wait[fd] = owner - poller.register(fd, conditions) - self._io_wait_add = [] - # Stop if nothing is listening anymore if stop_on_empty and not (self._io_wait): break # Wait for I/O events try: - io_events = poller.poll(None) + io_events = self._poller.poll(None) except select.error, err: # EINTR can happen when signals are sent if err.args and err.args[0] in (errno.EINTR,): @@ -161,22 +138,8 @@ class Mainloop(object): assert isinstance(fd, (int, long)), \ "Only integers are supported for file descriptors" - self._io_wait_add.append((owner, fd, condition)) - - def UnregisterIO(self, fd): - """Unregister a file descriptor. - - It'll be unregistered the next time the mainloop checks for it. - - @type fd: int - @param fd: File descriptor - - """ - # select.Poller also supports file() like objects, but we don't. - assert isinstance(fd, (int, long)), \ - "Only integers are supported for file descriptors" - - self._io_wait_remove.append(fd) + self._io_wait[fd] = owner + self._poller.register(fd, condition) def RegisterSignal(self, owner): """Registers a receiver for signal notifications -- 1.5.6.5