diff --git a/ChangeLog b/ChangeLog index 102318ee7db90a24a60c962e8e16e648e9523333..921ca8fe889b9557056bcd615015c2b003a06051 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 c9ea5638d56a2d8a09750b59fa17bf002b5c72f3..0887008b4df2a19a6ea91517868ea523ffcff9bd 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;