]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
Avoid bogus I/O event errors when closing the QEMU monitor
authorDaniel P. Berrange <berrange@redhat.com>
Fri, 28 Sep 2012 14:27:39 +0000 (15:27 +0100)
committerDaniel P. Berrange <berrange@redhat.com>
Fri, 28 Sep 2012 15:50:51 +0000 (16:50 +0100)
After calling qemuMonitorClose(), it is still possible for
the QEMU monitor I/O event callback to get invoked. This
will trigger an error message because mon->fd has been set
to -1 at this point. Silently ignore the case where mon->fd
is -1, likewise for mon->watch being zero.

Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
src/qemu/qemu_monitor.c

index cb121e824ea1746561d78c9eb42f91db5aaf0a7c..85b0bc228c30da385f8343d18ad5522434d428cd 100644 (file)
@@ -538,6 +538,9 @@ static void qemuMonitorUpdateWatch(qemuMonitorPtr mon)
         VIR_EVENT_HANDLE_HANGUP |
         VIR_EVENT_HANDLE_ERROR;
 
+    if (!mon->watch)
+        return;
+
     if (mon->lastError.code == VIR_ERR_OK) {
         events |= VIR_EVENT_HANDLE_READABLE;
 
@@ -563,6 +566,11 @@ qemuMonitorIO(int watch, int fd, int events, void *opaque) {
 #if DEBUG_IO
     VIR_DEBUG("Monitor %p I/O on watch %d fd %d events %d", mon, watch, fd, events);
 #endif
+    if (mon->fd == -1 || mon->watch == 0) {
+        qemuMonitorUnlock(mon);
+        virObjectUnref(mon);
+        return;
+    }
 
     if (mon->fd != fd || mon->watch != watch) {
         if (events & (VIR_EVENT_HANDLE_HANGUP | VIR_EVENT_HANDLE_ERROR))
@@ -830,8 +838,10 @@ void qemuMonitorClose(qemuMonitorPtr mon)
           "mon=%p refs=%d", mon, mon->object.refs);
 
     if (mon->fd >= 0) {
-        if (mon->watch)
+        if (mon->watch) {
             virEventRemoveHandle(mon->watch);
+            mon->watch = 0;
+        }
         VIR_FORCE_CLOSE(mon->fd);
     }