]> xenbits.xensource.com Git - libvirt.git/commitdiff
rpc: simplify calling convention of virNetServerClientDispatchFunc
authorDaniel P. Berrangé <berrange@redhat.com>
Tue, 6 Mar 2018 16:44:34 +0000 (16:44 +0000)
committerDaniel P. Berrangé <berrange@redhat.com>
Thu, 8 Mar 2018 15:40:29 +0000 (15:40 +0000)
Currently virNetServerClientDispatchFunc implementations are only
responsible for free'ing the "msg" parameter upon success. Simplify the
calling convention by making it their unconditional responsibility to
free the "msg", and close the client if desired.

Reviewed-by: John Ferlan <jferlan@redhat.com>
Reviewed-by: Jim Fehlig <jfehlig@suse.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
src/rpc/virnetserver.c
src/rpc/virnetserverclient.c
src/rpc/virnetserverclient.h

index 28afe54e497f00a8f6c7258ed1cf07f6bcb939da..7a1376bf49a20a2437840cea18102a8d24524268 100644 (file)
@@ -182,15 +182,14 @@ static void virNetServerHandleJob(void *jobOpaque, void *opaque)
     VIR_FREE(job);
 }
 
-static int virNetServerDispatchNewMessage(virNetServerClientPtr client,
-                                          virNetMessagePtr msg,
-                                          void *opaque)
+static void virNetServerDispatchNewMessage(virNetServerClientPtr client,
+                                           virNetMessagePtr msg,
+                                           void *opaque)
 {
     virNetServerPtr srv = opaque;
     virNetServerProgramPtr prog = NULL;
     unsigned int priority = 0;
     size_t i;
-    int ret = -1;
 
     VIR_DEBUG("server=%p client=%p message=%p",
               srv, client, msg);
@@ -207,7 +206,7 @@ static int virNetServerDispatchNewMessage(virNetServerClientPtr client,
         virNetServerJobPtr job;
 
         if (VIR_ALLOC(job) < 0)
-            goto cleanup;
+            goto error;
 
         job->client = client;
         job->msg = msg;
@@ -218,21 +217,24 @@ static int virNetServerDispatchNewMessage(virNetServerClientPtr client,
         }
 
         virObjectRef(client);
-        ret = virThreadPoolSendJob(srv->workers, priority, job);
-
-        if (ret < 0) {
+        if (virThreadPoolSendJob(srv->workers, priority, job) < 0) {
             virObjectUnref(client);
             VIR_FREE(job);
             virObjectUnref(prog);
+            goto error;
         }
     } else {
-        ret = virNetServerProcessMsg(srv, client, prog, msg);
+        if (virNetServerProcessMsg(srv, client, prog, msg) < 0)
+            goto error;
     }
 
- cleanup:
     virObjectUnlock(srv);
+    return;
 
-    return ret;
+ error:
+    virNetMessageFree(msg);
+    virNetServerClientClose(client);
+    virObjectUnlock(srv);
 }
 
 /**
index 00459d17ba14555a56212bc109d7acabd18b973b..ea0d5abdeecc436a9285ca049565f7459bb87007 100644 (file)
@@ -1315,11 +1315,11 @@ static void virNetServerClientDispatchRead(virNetServerClientPtr client)
 
         /* Send off to for normal dispatch to workers */
         if (msg) {
-            if (!client->dispatchFunc ||
-                client->dispatchFunc(client, msg, client->dispatchOpaque) < 0) {
+            if (!client->dispatchFunc) {
                 virNetMessageFree(msg);
                 client->wantClose = true;
-                return;
+            } else {
+                client->dispatchFunc(client, msg, client->dispatchOpaque);
             }
         }
 
index 1a939ad4e166b4efa4228cb1465e7f6eb7e25752..b21446eeb76fa03ea737b778eab7f7b311515012 100644 (file)
@@ -36,9 +36,12 @@ typedef virNetServer *virNetServerPtr;
 typedef struct _virNetServerClient virNetServerClient;
 typedef virNetServerClient *virNetServerClientPtr;
 
-typedef int (*virNetServerClientDispatchFunc)(virNetServerClientPtr client,
-                                              virNetMessagePtr msg,
-                                              void *opaque);
+/* This function owns the "msg" pointer it is passed and
+ * must arrange for virNetMessageFree to be called on it
+ */
+typedef void (*virNetServerClientDispatchFunc)(virNetServerClientPtr client,
+                                               virNetMessagePtr msg,
+                                               void *opaque);
 
 typedef int (*virNetServerClientFilterFunc)(virNetServerClientPtr client,
                                             virNetMessagePtr msg,