]> xenbits.xensource.com Git - libvirt.git/commitdiff
Avoid bogus event loop wakeups in remote driver when doing RPC call
authorDaniel P. Berrange <berrange@redhat.com>
Tue, 20 Jan 2009 11:45:09 +0000 (11:45 +0000)
committerDaniel P. Berrange <berrange@redhat.com>
Tue, 20 Jan 2009 11:45:09 +0000 (11:45 +0000)
ChangeLog
src/remote_internal.c

index 03e3e50247b7fd212fb8ec706dc50cadc3ce9de1..d961b59425b5010836c9df0d3ee84c2479d40b36 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Tue Jan 20 11:43:53 GMT 2009 Daniel P. Berrange <berrange@redhat.com>
+
+       * src/remote_internal.c: Disable event watch when doing an
+       RPC call to avoid bogus event loop wakeups which would
+       block on a lock
+
 Tue Jan 20 11:28:53 GMT 2009 Daniel P. Berrange <berrange@redhat.com>
 
        * src/remote_internal.c: Add locking to all public API entry
index 24cf241060f28f1cee8fea4e487ffa74118206d0..82ab7b22692b441ea3f3ffc9317c7759a0f6e0ed 100644 (file)
@@ -754,9 +754,7 @@ doRemoteOpen (virConnectPtr conn,
     DEBUG0("Adding Handler for remote events");
     /* Set up a callback to listen on the socket data */
     if ((priv->watch = virEventAddHandle(priv->sock,
-                                         VIR_EVENT_HANDLE_READABLE |
-                                         VIR_EVENT_HANDLE_ERROR |
-                                         VIR_EVENT_HANDLE_HANGUP,
+                                         VIR_EVENT_HANDLE_READABLE,
                                          remoteDomainEventFired,
                                          conn, NULL)) < 0) {
         DEBUG0("virEventAddHandle failed: No addHandleImpl defined."
@@ -5555,11 +5553,11 @@ static int really_read (virConnectPtr conn, struct private_data *priv,
  * else Bad Things will happen in the XDR code.
  */
 static int
-call (virConnectPtr conn, struct private_data *priv,
-      int flags /* if we are in virConnectOpen */,
-      int proc_nr,
-      xdrproc_t args_filter, char *args,
-      xdrproc_t ret_filter, char *ret)
+doCall (virConnectPtr conn, struct private_data *priv,
+        int flags /* if we are in virConnectOpen */,
+        int proc_nr,
+        xdrproc_t args_filter, char *args,
+        xdrproc_t ret_filter, char *ret)
 {
     char buffer[REMOTE_MESSAGE_MAX];
     char buffer2[4];
@@ -5750,6 +5748,34 @@ retry_read:
     }
 }
 
+
+static int
+call (virConnectPtr conn, struct private_data *priv,
+      int flags /* if we are in virConnectOpen */,
+      int proc_nr,
+      xdrproc_t args_filter, char *args,
+      xdrproc_t ret_filter, char *ret)
+{
+    int rv;
+    /*
+     * Avoid needless wake-ups of the event loop in the
+     * case where this call is being made from a different
+     * thread than the event loop. These wake-ups would
+     * cause the event loop thread to be blocked on the
+     * mutex for the duration of the call
+     */
+    if (priv->watch >= 0)
+        virEventUpdateHandle(priv->watch, 0);
+
+    rv = doCall(conn, priv,flags, proc_nr,
+                args_filter, args,
+                ret_filter, ret);
+
+    if (priv->watch >= 0)
+        virEventUpdateHandle(priv->watch, VIR_EVENT_HANDLE_READABLE);
+    return rv;
+}
+
 static int
 really_write_buf (virConnectPtr conn, struct private_data *priv,
                   int in_open /* if we are in virConnectOpen */,