From 29ed758ae055edbfb892b7c6a28c9b876abf4a57 Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Mon, 16 Mar 2009 10:35:21 +0000 Subject: [PATCH] Fix dispatch of FD events when one or more handles are marked deleted --- ChangeLog | 5 +++++ qemud/event.c | 15 ++++++++------- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index 102318ee7d..921ca8fe88 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Mon Mar 16 10:35:00 GMT 2009 Daniel P. Berrange + + * qemud/event.c: Fix dispatch of FD events when one or more + handles has been marked as deleted + Mon Mar 16 10:30:00 GMT 2009 Daniel P. Berrange * qemud/remote.c: Don't allocate cpumaps arg if maplength is diff --git a/qemud/event.c b/qemud/event.c index c9ea5638d5..0887008b4d 100644 --- a/qemud/event.c +++ b/qemud/event.c @@ -409,25 +409,26 @@ static int virEventDispatchTimeouts(void) { * Returns 0 upon success, -1 if an error occurred */ static int virEventDispatchHandles(int nfds, struct pollfd *fds) { - int i; + int i, n; - for (i = 0 ; i < nfds ; i++) { + for (i = 0, n = 0 ; i < eventLoop.handlesCount && n < nfds ; i++) { if (eventLoop.handles[i].deleted) { EVENT_DEBUG("Skip deleted %d", eventLoop.handles[i].fd); continue; } - if (fds[i].revents) { + if (fds[n].revents) { virEventHandleCallback cb = eventLoop.handles[i].cb; void *opaque = eventLoop.handles[i].opaque; - int hEvents = virPollEventToEventHandleType(fds[i].revents); - EVENT_DEBUG("Dispatch %d %d %p", fds[i].fd, - fds[i].revents, eventLoop.handles[i].opaque); + int hEvents = virPollEventToEventHandleType(fds[n].revents); + EVENT_DEBUG("Dispatch %d %d %p", fds[n].fd, + fds[n].revents, eventLoop.handles[i].opaque); virEventUnlock(); (cb)(eventLoop.handles[i].watch, - fds[i].fd, hEvents, opaque); + fds[n].fd, hEvents, opaque); virEventLock(); } + n++; } return 0;