]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
Move queuing of RPC replies into dispatch code
authorDaniel P. Berrange <berrange@redhat.com>
Fri, 10 Jul 2009 11:45:37 +0000 (12:45 +0100)
committerDaniel P. Berrange <berrange@redhat.com>
Thu, 16 Jul 2009 15:09:47 +0000 (16:09 +0100)
This removes an assumption from qemudWorker() code that every
incoming message will generate a reply.

* qemud/dispatch.c: remoteDispatchClientRequest now has responsibility
  for queuing the reply message to the RPC call
* qemud/qemud.c: Do not queue the RPC call reply in qemudWorker(),
  allowing remoteDispatchClientRequest() to take care of it

qemud/dispatch.c
qemud/qemud.c

index 29970e482ee942eb581a022e420fbc7a46fd9d4d..ce8dbc9fc3f62b9b4c34eb4b7e74d275a5cd9d62 100644 (file)
@@ -387,6 +387,12 @@ rpc_error:
     msg->bufferLength = len;
     msg->bufferOffset = 0;
 
+    /* Put reply on end of tx queue to send out  */
+    qemudClientMessageQueuePush(&client->tx, msg);
+
+    if (qemudRegisterClientEvent(server, client, 1) < 0)
+        qemudDispatchClientFailure(client);
+
     return 0;
 
 fatal_error:
index c577d88271496ed3684e7eedf407072833bd1c74..4952d0bdc14bd5af9e20291e18fe98cdd20101c9 100644 (file)
@@ -1431,7 +1431,7 @@ static void *qemudWorker(void *data)
 
     while (1) {
         struct qemud_client *client = NULL;
-        struct qemud_client_message *reply;
+        struct qemud_client_message *msg;
 
         virMutexLock(&server->lock);
         while (((client = qemudPendingJob(server)) == NULL) &&
@@ -1454,25 +1454,19 @@ static void *qemudWorker(void *data)
         client->refs++;
 
         /* Remove our message from dispatch queue while we use it */
-        reply = qemudClientMessageQueueServe(&client->dx);
+        msg = qemudClientMessageQueueServe(&client->dx);
 
         /* This function drops the lock during dispatch,
          * and re-acquires it before returning */
-        if (remoteDecodeClientMessageHeader(reply) < 0 ||
-            remoteDispatchClientRequest (server, client, reply) < 0) {
-            VIR_FREE(reply);
+        if (remoteDecodeClientMessageHeader(msg) < 0 ||
+            remoteDispatchClientRequest (server, client, msg) < 0) {
+            VIR_FREE(msg);
             qemudDispatchClientFailure(client);
             client->refs--;
             virMutexUnlock(&client->lock);
             continue;
         }
 
-        /* Put reply on end of tx queue to send out  */
-        qemudClientMessageQueuePush(&client->tx, reply);
-
-        if (qemudRegisterClientEvent(server, client, 1) < 0)
-            qemudDispatchClientFailure(client);
-
         client->refs--;
         virMutexUnlock(&client->lock);