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
Signed-off-by: Daniel P. Berrange <berrange(a)redhat.com>
---
qemud/dispatch.c | 6 ++++++
qemud/qemud.c | 16 +++++-----------
2 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/qemud/dispatch.c b/qemud/dispatch.c
index 29970e4..ce8dbc9 100644
--- a/qemud/dispatch.c
+++ b/qemud/dispatch.c
@@ -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:
diff --git a/qemud/qemud.c b/qemud/qemud.c
index c577d88..4952d0b 100644
--- a/qemud/qemud.c
+++ b/qemud/qemud.c
@@ -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);
--
1.6.2.5
--
|: Red Hat, Engineering, London -o-
http://people.redhat.com/berrange/ :|
|:
http://libvirt.org -o-
http://virt-manager.org -o-
http://ovirt.org :|
|:
http://autobuild.org -o-
http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|