[libvirt] [PATCH 1/7] remote generator: Handle virDomainCreateWithFlags

Matthias Bolte matthias.bolte at googlemail.com
Mon May 23 17:36:04 UTC 2011


Add special case code for updating a given domain object instead of
returning a new one.
---
 daemon/remote.c              |   30 -----------------------
 daemon/remote_generator.pl   |   55 +++++++++++++++++++++++++++++------------
 src/remote/remote_driver.c   |   32 ------------------------
 src/remote/remote_protocol.x |    2 +-
 4 files changed, 40 insertions(+), 79 deletions(-)

diff --git a/daemon/remote.c b/daemon/remote.c
index 80783b3..fcda2c5 100644
--- a/daemon/remote.c
+++ b/daemon/remote.c
@@ -895,36 +895,6 @@ cleanup:
 }
 
 static int
-remoteDispatchDomainCreateWithFlags(struct qemud_server *server ATTRIBUTE_UNUSED,
-                                    struct qemud_client *client ATTRIBUTE_UNUSED,
-                                    virConnectPtr conn,
-                                    remote_message_header *hdr ATTRIBUTE_UNUSED,
-                                    remote_error *rerr,
-                                    remote_domain_create_with_flags_args *args,
-                                    remote_domain_create_with_flags_ret *ret)
-{
-    int rv = -1;
-    virDomainPtr dom = NULL;
-
-    if (!(dom = get_nonnull_domain(conn, args->dom)))
-        goto cleanup;
-
-    if (virDomainCreateWithFlags(dom, args->flags) < 0)
-        goto cleanup;
-
-    make_nonnull_domain(&ret->dom, dom);
-
-    rv = 0;
-
-cleanup:
-    if (rv < 0)
-        remoteDispatchError(rerr);
-    if (dom)
-        virDomainFree(dom);
-    return rv;
-}
-
-static int
 remoteDispatchDomainGetSecurityLabel(struct qemud_server *server ATTRIBUTE_UNUSED,
                                      struct qemud_client *client ATTRIBUTE_UNUSED,
                                      virConnectPtr conn,
diff --git a/daemon/remote_generator.pl b/daemon/remote_generator.pl
index d21f959..b23e3b1 100755
--- a/daemon/remote_generator.pl
+++ b/daemon/remote_generator.pl
@@ -450,14 +450,22 @@ elsif ($opt_b) {
                 } elsif ($ret_member =~ m/^remote_nonnull_(domain|network|storage_pool|storage_vol|interface|node_device|secret|nwfilter|domain_snapshot) (\S+);/) {
                     my $type_name = name_to_ProcName($1);
 
-                    push(@vars_list, "vir${type_name}Ptr $2 = NULL");
-                    push(@ret_list, "make_nonnull_$1(&ret->$2, $2);");
-                    push(@free_list,
-                         "    if ($2)\n" .
-                         "        vir${type_name}Free($2);");
-                    $single_ret_var = $2;
-                    $single_ret_by_ref = 0;
-                    $single_ret_check = " == NULL";
+                    if ($call->{ProcName} eq "DomainCreateWithFlags") {
+                        # SPECIAL: virDomainCreateWithFlags updates the given
+                        #          domain object instead of returning a new one
+                        push(@ret_list, "make_nonnull_$1(&ret->$2, $2);");
+                        $single_ret_var = undef;
+                        $single_ret_by_ref = 1;
+                    } else {
+                        push(@vars_list, "vir${type_name}Ptr $2 = NULL");
+                        push(@ret_list, "make_nonnull_$1(&ret->$2, $2);");
+                        push(@free_list,
+                             "    if ($2)\n" .
+                             "        vir${type_name}Free($2);");
+                        $single_ret_var = $2;
+                        $single_ret_by_ref = 0;
+                        $single_ret_check = " == NULL";
+                    }
                 } elsif ($ret_member =~ m/^int (\S+)<(\S+)>;/) {
                     push(@vars_list, "int len");
                     push(@ret_list, "ret->$1.$1_len = len;");
@@ -679,7 +687,12 @@ elsif ($opt_b) {
             if ($single_ret_by_ref) {
                 print "    if (vir$prefix$proc_name(";
                 print join(', ', @args_list);
-                print ", &$single_ret_var) < 0)\n";
+
+                if (defined $single_ret_var) {
+                    print ", &$single_ret_var";
+                }
+
+                print ") < 0)\n";
             } else {
                 print "    if (($single_ret_var = vir$prefix$proc_name(";
                 print join(', ', @args_list);
@@ -979,15 +992,25 @@ elsif ($opt_k) {
                         $priv_name = "${name}PrivateData";
                     }
 
-                    if ($name eq "domain_snapshot") {
-                        push(@ret_list, "rv = get_nonnull_$name(dom, ret.$arg_name);");
+                    if ($call->{ProcName} eq "DomainCreateWithFlags") {
+                        # SPECIAL: virDomainCreateWithFlags updates the given
+                        #          domain object instead of returning a new one
+                        push(@ret_list, "dom->id = ret.dom.id;");
+                        push(@ret_list, "xdr_free((xdrproc_t)xdr_$call->{ret}, (char *)&ret);");
+                        push(@ret_list, "rv = 0;");
+                        $single_ret_var = "int rv = -1";
+                        $single_ret_type = "int";
                     } else {
-                        push(@ret_list, "rv = get_nonnull_$name($priv_src, ret.$arg_name);");
-                    }
+                        if ($name eq "domain_snapshot") {
+                            push(@ret_list, "rv = get_nonnull_$name(dom, ret.$arg_name);");
+                        } else {
+                            push(@ret_list, "rv = get_nonnull_$name($priv_src, ret.$arg_name);");
+                        }
 
-                    push(@ret_list, "xdr_free((xdrproc_t)xdr_$call->{ret}, (char *)&ret);");
-                    $single_ret_var = "vir${type_name}Ptr rv = NULL";
-                    $single_ret_type = "vir${type_name}Ptr";
+                        push(@ret_list, "xdr_free((xdrproc_t)xdr_$call->{ret}, (char *)&ret);");
+                        $single_ret_var = "vir${type_name}Ptr rv = NULL";
+                        $single_ret_type = "vir${type_name}Ptr";
+                    }
                 } elsif ($ret_member =~ m/^int (\S+);/) {
                     my $arg_name = $1;
 
diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c
index 8c69743..69b888d 100644
--- a/src/remote/remote_driver.c
+++ b/src/remote/remote_driver.c
@@ -2441,38 +2441,6 @@ done:
     return rv;
 }
 
-static int
-remoteDomainCreateWithFlags (virDomainPtr domain, unsigned int flags)
-{
-    int rv = -1;
-    remote_domain_create_with_flags_args args;
-    remote_domain_create_with_flags_ret ret;
-    struct private_data *priv = domain->conn->privateData;
-
-    remoteDriverLock(priv);
-
-    make_nonnull_domain (&args.dom, domain);
-    args.flags = flags;
-
-    memset (&ret, 0, sizeof ret);
-    if (call (domain->conn, priv, 0, REMOTE_PROC_DOMAIN_CREATE_WITH_FLAGS,
-              (xdrproc_t) xdr_remote_domain_create_with_flags_args,
-              (char *) &args,
-              (xdrproc_t) xdr_remote_domain_create_with_flags_ret,
-              (char *) &ret) == -1)
-        goto done;
-
-    domain->id = ret.dom.id;
-    xdr_free ((xdrproc_t) &xdr_remote_domain_create_with_flags_ret,
-              (char *) &ret);
-
-    rv = 0;
-
-done:
-    remoteDriverUnlock(priv);
-    return rv;
-}
-
 static char *
 remoteDomainGetSchedulerType (virDomainPtr domain, int *nparams)
 {
diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x
index f0da95d..9df86da 100644
--- a/src/remote/remote_protocol.x
+++ b/src/remote/remote_protocol.x
@@ -2266,7 +2266,7 @@ enum remote_procedure {
     REMOTE_PROC_DOMAIN_SNAPSHOT_DELETE = 193, /* autogen autogen */
     REMOTE_PROC_DOMAIN_GET_BLOCK_INFO = 194, /* autogen autogen */
     REMOTE_PROC_DOMAIN_EVENT_IO_ERROR_REASON = 195, /* autogen autogen */
-    REMOTE_PROC_DOMAIN_CREATE_WITH_FLAGS = 196, /* skipgen skipgen */
+    REMOTE_PROC_DOMAIN_CREATE_WITH_FLAGS = 196, /* autogen autogen */
     REMOTE_PROC_DOMAIN_SET_MEMORY_PARAMETERS = 197, /* skipgen skipgen */
     REMOTE_PROC_DOMAIN_GET_MEMORY_PARAMETERS = 198, /* skipgen skipgen */
     REMOTE_PROC_DOMAIN_SET_VCPUS_FLAGS = 199, /* autogen autogen */
-- 
1.7.0.4




More information about the libvir-list mailing list