[libvirt] [PATCH 15/21] gendispatch: Be able to generate multi-return values
Ján Tomko
jtomko at redhat.com
Thu Mar 10 13:55:40 UTC 2016
On Thu, Mar 10, 2016 at 05:54:04AM +0100, Martin Kletzander wrote:
> Let's call it modern_ret_as_list as opposed to single_ret_as_list. The
> latter was able to return list of things. However the new, more modern,
> version came and it is used since listAllDomains till nowadays in
> ListServers.
>
> Signed-off-by: Martin Kletzander <mkletzan at redhat.com>
> ---
> src/rpc/gendispatch.pl | 200 ++++++++++++++++++++++++++++++++++++++++++-------
> 1 file changed, 172 insertions(+), 28 deletions(-)
>
> @@ -1277,6 +1348,9 @@ elsif ($mode eq "client") {
> my $single_ret_list_max_define = "undefined";
> my $single_ret_cleanup = 0;
> my $multi_ret = 0;
> + my $modern_ret_as_list = 0;
> + my $modern_ret_struct_name = 0;
The other strings use "undefined" as the initializer.
> + my $modern_ret_var_type = "undefined";
>
> if ($rettype ne "void" and
> scalar(@{$call->{ret_members}}) > 1) {
> @@ -1296,6 +1370,20 @@ elsif ($mode eq "client") {
> }
>
> push(@ret_list, "memcpy(result->$3, ret.$3, sizeof(result->$3));");
> + } elsif ($ret_member =~ m/admin_nonnull_(server) (\S+)<(\S+)>;/) {
> + my $proc_name = name_to_TypeName($1);
> +
> + if ($structprefix eq "admin") {
> + $modern_ret_var_type = "virAdm${proc_name}Ptr";
> + } else {
> + $modern_ret_var_type = "vir${proc_name}Ptr";
> + }
> +
> + $modern_ret_struct_name = $1;
This should also set:
$single_ret_list_error_msg_type = $1;
Otherwise the commit after this generates a funny error in remoteAdminConnectListServers:
+ if (ret.servers.servers_len > ADMIN_SERVER_LIST_MAX) {
+ virReportError(VIR_ERR_RPC,
+ _("too many remote undefineds: %d > %d"),
+ ret.servers.servers_len, ADMIN_SERVER_LIST_MAX);
+ goto cleanup;
+ }
> + $single_ret_list_name = $2;
> + $single_ret_list_max_var = $3;
> +
> + $modern_ret_as_list = 1;
> } elsif ($ret_member =~ m/<\S+>;/ or $ret_member =~ m/\[\S+\];/) {
> # just make all other array types fail
> die "unhandled type for multi-return-value for " .
> - my $struct_name = $call->{ProcName};
> - $struct_name =~ s/Get//;
> + if ($modern_ret_as_list) {
> + $struct_name = name_to_TypeName($modern_ret_struct_name);
> +
> + $struct_name .= "Ptr **";
> + if ($structprefix eq "admin") {
> + $struct_name = "Adm${struct_name}";
> + }
> + } else {
> + $struct_name = $call->{ProcName};
>
> - splice(@args_list, $call->{ret_offset}, 0, ("vir${struct_name}Ptr result"));
> + $struct_name =~ s/Get//;
> + $struct_name = "${struct_name}Ptr "
> + }
> + splice(@args_list, $call->{ret_offset}, 0, ("vir$struct_name result"));
There's an extra space between ${struct_name} and result.
> }
>
> if ($call->{streamflag} ne "none") {
> @@ -1482,7 +1594,8 @@ elsif ($mode eq "client") {
> print " $var;\n";
> }
>
> - if ($single_ret_as_list) {
> + if ($single_ret_as_list or
> + $modern_ret_as_list) {
> print " size_t i;\n";
> }
>
ACK with the nits fixed.
Jan
More information about the libvir-list
mailing list