[libvirt] [PATCH 3/6] Refactor code for passing the buck in the remote client

Daniel P. Berrange berrange at redhat.com
Fri Nov 11 16:22:01 UTC 2011


From: "Daniel P. Berrange" <berrange at redhat.com>

Remove some duplication by pulling the code for passing the
buck out into a helper method

* src/rpc/virnetclient.c: Introduce virNetClientIOEventLoopPassTheBuck
---
 src/rpc/virnetclient.c |   35 +++++++++++++++++++----------------
 1 files changed, 19 insertions(+), 16 deletions(-)

diff --git a/src/rpc/virnetclient.c b/src/rpc/virnetclient.c
index 73dfc6e..1f46965 100644
--- a/src/rpc/virnetclient.c
+++ b/src/rpc/virnetclient.c
@@ -1025,6 +1025,23 @@ static bool virNetClientIOEventLoopRemoveDone(virNetClientCallPtr call,
     return true;
 }
 
+
+static void virNetClientIOEventLoopPassTheBuck(virNetClientPtr client, virNetClientCallPtr thiscall)
+{
+    VIR_DEBUG("Giving up the buck %p", thiscall);
+    virNetClientCallPtr tmp = client->waitDispatch;
+    /* See if someone else is still waiting
+     * and if so, then pass the buck ! */
+    while (tmp) {
+        if (tmp != thiscall) {
+            VIR_DEBUG("Passing the buck to %p", tmp);
+            virCondSignal(&tmp->cond);
+            break;
+        }
+        tmp = tmp->next;
+    }
+}
+
 /*
  * Process all calls pending dispatch/receive until we
  * get a reply to our own call. Then quit and pass the buck
@@ -1139,15 +1156,7 @@ static int virNetClientIOEventLoop(virNetClientPtr client,
         /* Now see if *we* are done */
         if (thiscall->mode == VIR_NET_CLIENT_MODE_COMPLETE) {
             virNetClientCallRemove(&client->waitDispatch, thiscall);
-
-            VIR_DEBUG("Giving up the buck %p %p", thiscall, client->waitDispatch);
-
-            /* See if someone else is still waiting
-             * and if so, then pass the buck ! */
-            if (client->waitDispatch) {
-                VIR_DEBUG("Passing the buck to %p", client->waitDispatch);
-                virCondSignal(&client->waitDispatch->cond);
-            }
+            virNetClientIOEventLoopPassTheBuck(client, thiscall);
             return 0;
         }
 
@@ -1162,13 +1171,7 @@ static int virNetClientIOEventLoop(virNetClientPtr client,
 
 error:
     virNetClientCallRemove(&client->waitDispatch, thiscall);
-    VIR_DEBUG("Giving up the buck due to I/O error %p %p", thiscall, client->waitDispatch);
-    /* See if someone else is still waiting
-     * and if so, then pass the buck ! */
-    if (client->waitDispatch) {
-        VIR_DEBUG("Passing the buck to %p", client->waitDispatch);
-        virCondSignal(&client->waitDispatch->cond);
-    }
+    virNetClientIOEventLoopPassTheBuck(client, thiscall);
     return -1;
 }
 
-- 
1.7.6.4




More information about the libvir-list mailing list