]> xenbits.xensource.com Git - libvirt.git/commitdiff
Misc fixes to event registration failure cases
authorDaniel P. Berrange <berrange@redhat.com>
Fri, 21 Nov 2008 10:22:58 +0000 (10:22 +0000)
committerDaniel P. Berrange <berrange@redhat.com>
Fri, 21 Nov 2008 10:22:58 +0000 (10:22 +0000)
ChangeLog
src/remote_internal.c

index 0fa64ddb85d46e0f43c92c7966a26d7208c3e858..84b302bd9f74848280e7a7e8edf1e160761d680b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Fri Nov 21 10:20:14 BST 2008 Daniel P. Berrange <berrange@redhat.com>
+
+       * src/remote_internal.c: Return VIR_NO_SUPPORT if requested
+       to register event callbacks when no eventloop is present.
+       Deal with failure to register handles/timers correctly.
+       (David Lively)
+
 Fri Nov 21 10:14:14 BST 2008 Daniel P. Berrange <berrange@redhat.com>
 
        Fix crash due to failure to unregister event callbacks on
index 21f716d3db443a686549d3b30033b6f0c374583b..508325afc820d1c8f365241df895d8e40287249a 100644 (file)
@@ -773,6 +773,7 @@ doRemoteOpen (virConnectPtr conn,
                                                          conn, NULL)) < 0) {
             DEBUG0("virEventAddTimeout failed: No addTimeoutImpl defined. "
                     "continuing without events.");
+            virEventRemoveHandle(priv->watch);
         }
     }
     /* Successful. */
@@ -1211,10 +1212,12 @@ doRemoteClose (virConnectPtr conn, struct private_data *priv)
               (xdrproc_t) xdr_void, (char *) NULL) == -1)
         return -1;
 
-    /* Remove handle for remote events */
-    virEventRemoveHandle(priv->sock);
-    /* Remove timout */
-    virEventRemoveTimeout(priv->eventFlushTimer);
+    if (priv->eventFlushTimer >= 0) {
+        /* Remove timeout */
+        virEventRemoveTimeout(priv->eventFlushTimer);
+        /* Remove handle for remote events */
+        virEventRemoveHandle(priv->watch);
+    }
 
     /* Close socket. */
     if (priv->uses_tls && priv->session) {
@@ -4483,6 +4486,10 @@ static int remoteDomainEventRegister (virConnectPtr conn,
 {
     struct private_data *priv = conn->privateData;
 
+    if (priv->eventFlushTimer < 0) {
+         error (conn, VIR_ERR_NO_SUPPORT, _("no event support"));
+         return -1;
+    }
     if (virDomainEventCallbackListAdd(conn, priv->callbackList,
                                       callback, opaque, freecb) < 0) {
          error (conn, VIR_ERR_RPC, _("adding cb to list"));