[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[libvirt] [PATCH 2/4] Refactor message sending to allow code reuse for data streams



Splits up the 'call' method moving generic IO code out into
separate method to allow it to be easily reused for sending
data streams

* src/remote_internal.c: Split 'call' into two methods, the first
  with same name serializes a set of method arguments into a
  message, the second 'remoteIO' takes a pre-serialized messages,
  sends it and awaits a reply

Signed-off-by: Daniel P. Berrange <berrange redhat com>
---
 src/remote_internal.c |   60 ++++++++++++++++++++++++++++++++----------------
 1 files changed, 40 insertions(+), 20 deletions(-)

diff --git a/src/remote_internal.c b/src/remote_internal.c
index 4362521..eefead0 100644
--- a/src/remote_internal.c
+++ b/src/remote_internal.c
@@ -6943,7 +6943,7 @@ error:
 }
 
 /*
- * This function performs a remote procedure call to procedure PROC_NR.
+ * This function sends a message to remote server and awaits a reply
  *
  * NB. This does not free the args structure (not desirable, since you
  * often want this allocated on the stack or else it contains strings
@@ -6976,24 +6976,16 @@ error:
  * NB(5) Don't Panic!
  */
 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)
+remoteIO(virConnectPtr conn,
+         struct private_data *priv,
+         int flags,
+         struct remote_thread_call *thiscall)
 {
     int rv;
-    struct remote_thread_call *thiscall;
-
-    DEBUG("Doing call %d %p", proc_nr, priv->waitDispatch);
-    thiscall = prepareCall(conn, priv, flags, proc_nr,
-                           args_filter, args,
-                           ret_filter, ret);
 
-    if (!thiscall) {
-        virReportOOMError (flags & REMOTE_CALL_IN_OPEN ? NULL : conn);
-        return -1;
-    }
+    DEBUG("Do proc=%d serial=%d length=%d wait=%p",
+          thiscall->proc_nr, thiscall->serial,
+          thiscall->bufferLength, priv->waitDispatch);
 
     /* Check to see if another thread is dispatching */
     if (priv->waitDispatch) {
@@ -7010,7 +7002,7 @@ call (virConnectPtr conn, struct private_data *priv,
         /* Force other thread to wakup from poll */
         safewrite(priv->wakeupSendFD, &ignore, sizeof(ignore));
 
-        DEBUG("Going to sleep %d %p %p", proc_nr, priv->waitDispatch, thiscall);
+        DEBUG("Going to sleep %d %p %p", thiscall->proc_nr, priv->waitDispatch, thiscall);
         /* Go to sleep while other thread is working... */
         if (virCondWait(&thiscall->cond, &priv->lock) < 0) {
             if (priv->waitDispatch == thiscall) {
@@ -7031,7 +7023,7 @@ call (virConnectPtr conn, struct private_data *priv,
             return -1;
         }
 
-        DEBUG("Wokeup from sleep %d %p %p", proc_nr, priv->waitDispatch, thiscall);
+        DEBUG("Wokeup from sleep %d %p %p", thiscall->proc_nr, priv->waitDispatch, thiscall);
         /* Two reasons we can be woken up
          *  1. Other thread has got our reply ready for us
          *  2. Other thread is all done, and it is our turn to
@@ -7055,7 +7047,7 @@ call (virConnectPtr conn, struct private_data *priv,
         priv->waitDispatch = thiscall;
     }
 
-    DEBUG("We have the buck %d %p %p", proc_nr, priv->waitDispatch, thiscall);
+    DEBUG("We have the buck %d %p %p", thiscall->proc_nr, priv->waitDispatch, thiscall);
     /*
      * The buck stops here!
      *
@@ -7086,7 +7078,7 @@ call (virConnectPtr conn, struct private_data *priv,
     }
 
 cleanup:
-    DEBUG("All done with our call %d %p %p", proc_nr, priv->waitDispatch, thiscall);
+    DEBUG("All done with our call %d %p %p", thiscall->proc_nr, priv->waitDispatch, thiscall);
     if (thiscall->mode == REMOTE_MODE_ERROR) {
         /* See if caller asked us to keep quiet about missing RPCs
          * eg for interop with older servers */
@@ -7110,6 +7102,34 @@ cleanup:
     return rv;
 }
 
+
+/*
+ * Serial a set of arguments into a method call message,
+ * send that to the server and wait for reply
+ */
+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)
+{
+    struct remote_thread_call *thiscall;
+
+    thiscall = prepareCall(conn, priv, flags, proc_nr,
+                           args_filter, args,
+                           ret_filter, ret);
+
+    if (!thiscall) {
+        virReportOOMError (flags & REMOTE_CALL_IN_OPEN ? NULL : conn);
+        return -1;
+    }
+
+    return remoteIO(conn, priv, flags, thiscall);
+}
+
+
+
 /**
  * remoteDomainReadEvent
  *
-- 
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 :|


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]