On Mon, May 23, 2011 at 07:36:04PM +0200, Matthias Bolte wrote:
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 */
ACK
Daniel
--
|:
http://berrange.com -o-
http://www.flickr.com/photos/dberrange/ :|
|:
http://libvirt.org -o-
http://virt-manager.org :|
|:
http://autobuild.org -o-
http://search.cpan.org/~danberr/ :|
|:
http://entangle-photo.org -o-
http://live.gnome.org/gtk-vnc :|