[libvirt] [PATCH] adding handling EINTR to poll to make it more robust
Dan Kenigsberg
danken at redhat.com
Sun Jul 22 15:01:50 UTC 2012
On Thu, Jul 19, 2012 at 09:49:41AM +0800, Royce Lv wrote:
> some system call and signal will interrupt poll,
> making event loop stops and fails to react events and keepalive message
> from libvirt.
> adding handling EINTR to poll to make it more robust
>
> Signed-off-by: Royce Lv <lvroyce at linux.vnet.ibm.com>
> ---
> examples/domain-events/events-python/event-test.py | 87 +++++++++++---------
> 1 file changed, 46 insertions(+), 41 deletions(-)
>
> diff --git a/examples/domain-events/events-python/event-test.py b/examples/domain-events/events-python/event-test.py
> index 96dc268..6b655cd 100644
> --- a/examples/domain-events/events-python/event-test.py
> +++ b/examples/domain-events/events-python/event-test.py
> @@ -178,48 +178,53 @@ class virEventLoopPure:
> def run_once(self):
> sleep = -1
> self.runningPoll = True
> - next = self.next_timeout()
> - debug("Next timeout due at %d" % next)
> - if next > 0:
> - now = int(time.time() * 1000)
> - if now >= next:
> - sleep = 0
> - else:
> - sleep = (next - now) / 1000.0
> -
> - debug("Poll with a sleep of %d" % sleep)
> - events = self.poll.poll(sleep)
> -
> - # Dispatch any file handle events that occurred
> - for (fd, revents) in events:
> - # See if the events was from the self-pipe
> - # telling us to wakup. if so, then discard
> - # the data just continue
> - if fd == self.pipetrick[0]:
> - self.pendingWakeup = False
> - data = os.read(fd, 1)
> - continue
> -
> - h = self.get_handle_by_fd(fd)
> - if h:
> - debug("Dispatch fd %d handle %d events %d" % (fd, h.get_id(), revents))
> - h.dispatch(self.events_from_poll(revents))
> -
> - now = int(time.time() * 1000)
> - for t in self.timers:
> - interval = t.get_interval()
> - if interval < 0:
> - continue
> + try:
> + next = self.next_timeout()
> + debug("Next timeout due at %d" % next)
> + if next > 0:
> + now = int(time.time() * 1000)
> + if now >= next:
> + sleep = 0
> + else:
> + sleep = (next - now) / 1000.0
> +
> + debug("Poll with a sleep of %d" % sleep)
> + events = self.poll.poll(sleep)
> +
> + # Dispatch any file handle events that occurred
> + for (fd, revents) in events:
> + # See if the events was from the self-pipe
> + # telling us to wakup. if so, then discard
> + # the data just continue
> + if fd == self.pipetrick[0]:
> + self.pendingWakeup = False
> + data = os.read(fd, 1)
> + continue
> +
> + h = self.get_handle_by_fd(fd)
> + if h:
> + debug("Dispatch fd %d handle %d events %d" % (fd, h.get_id(), revents))
> + h.dispatch(self.events_from_poll(revents))
>
> - want = t.get_last_fired() + interval
> - # Deduct 20ms, since schedular timeslice
> - # means we could be ever so slightly early
> - if now >= (want-20):
> - debug("Dispatch timer %d now %s want %s" % (t.get_id(), str(now), str(want)))
> - t.set_last_fired(now)
> - t.dispatch()
> -
> - self.runningPoll = False
> + now = int(time.time() * 1000)
> + for t in self.timers:
> + interval = t.get_interval()
> + if interval < 0:
> + continue
> +
> + want = t.get_last_fired() + interval
> + # Deduct 20ms, since scheduler timeslice
> + # means we could be ever so slightly early
> + if now >= (want-20):
> + debug("Dispatch timer %d now %s want %s" % (t.get_id(), str(now), str(want)))
> + t.set_last_fired(now)
> + t.dispatch()
> +
> + except (os.error, select.error), e:
> + if e.args[0] != errno.EINTR:
> + raise
> + finally:
> + self.runningPoll = False
Thanks, I'm happy with this version.
More information about the libvir-list
mailing list