Fix dispatch of FD events when one or more handles are marked deleted

This commit is contained in:
Daniel P. Berrange 2009-03-16 10:35:21 +00:00
parent 24a149cfa2
commit 29ed758ae0
2 changed files with 13 additions and 7 deletions

View File

@ -1,3 +1,8 @@
Mon Mar 16 10:35:00 GMT 2009 Daniel P. Berrange <berrange@redhat.com>
* 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 <berrange@redhat.com> Mon Mar 16 10:30:00 GMT 2009 Daniel P. Berrange <berrange@redhat.com>
* qemud/remote.c: Don't allocate cpumaps arg if maplength is * qemud/remote.c: Don't allocate cpumaps arg if maplength is

View File

@ -409,25 +409,26 @@ static int virEventDispatchTimeouts(void) {
* Returns 0 upon success, -1 if an error occurred * Returns 0 upon success, -1 if an error occurred
*/ */
static int virEventDispatchHandles(int nfds, struct pollfd *fds) { 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) { if (eventLoop.handles[i].deleted) {
EVENT_DEBUG("Skip deleted %d", eventLoop.handles[i].fd); EVENT_DEBUG("Skip deleted %d", eventLoop.handles[i].fd);
continue; continue;
} }
if (fds[i].revents) { if (fds[n].revents) {
virEventHandleCallback cb = eventLoop.handles[i].cb; virEventHandleCallback cb = eventLoop.handles[i].cb;
void *opaque = eventLoop.handles[i].opaque; void *opaque = eventLoop.handles[i].opaque;
int hEvents = virPollEventToEventHandleType(fds[i].revents); int hEvents = virPollEventToEventHandleType(fds[n].revents);
EVENT_DEBUG("Dispatch %d %d %p", fds[i].fd, EVENT_DEBUG("Dispatch %d %d %p", fds[n].fd,
fds[i].revents, eventLoop.handles[i].opaque); fds[n].revents, eventLoop.handles[i].opaque);
virEventUnlock(); virEventUnlock();
(cb)(eventLoop.handles[i].watch, (cb)(eventLoop.handles[i].watch,
fds[i].fd, hEvents, opaque); fds[n].fd, hEvents, opaque);
virEventLock(); virEventLock();
} }
n++;
} }
return 0; return 0;