[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