[libvirt] [PATCH 5/5] remote generator: Don't rely on $_ being stable over a large function

Matthias Bolte matthias.bolte at googlemail.com
Sun May 15 06:23:34 UTC 2011


Replace $calls{$_} with $call in the dispatch bodies generator function.

No functional change included.
---
 daemon/remote_generator.pl |  100 ++++++++++++++++++++++---------------------
 1 files changed, 51 insertions(+), 49 deletions(-)

diff --git a/daemon/remote_generator.pl b/daemon/remote_generator.pl
index c2468b9..5725583 100755
--- a/daemon/remote_generator.pl
+++ b/daemon/remote_generator.pl
@@ -272,11 +272,13 @@ elsif ($opt_b) {
     my @keys = sort (keys %calls);
 
     foreach (@keys) {
+        my $call = $calls{$_};
+
         # skip things which are REMOTE_MESSAGE
-        next if $calls{$_}->{msg};
+        next if $call->{msg};
 
         # skip procedures not on generate list
-        next if ! exists($generate{$calls{$_}->{ProcName}});
+        next if ! exists($generate{$call->{ProcName}});
 
         my $has_node_device = 0;
         my @vars_list = ();
@@ -288,11 +290,11 @@ elsif ($opt_b) {
         my @free_list_on_error = ("remoteDispatchError(rerr);");
 
         # handle arguments to the function
-        if ($calls{$_}->{args} ne "void") {
+        if ($call->{args} ne "void") {
             # node device is special, as it's identified by name
-            if ($calls{$_}->{args} =~ m/^remote_node_device_/ and
-                !($calls{$_}->{args} =~ m/^remote_node_device_lookup_by_name_/) and
-                !($calls{$_}->{args} =~ m/^remote_node_device_create_xml_/)) {
+            if ($call->{args} =~ m/^remote_node_device_/ and
+                !($call->{args} =~ m/^remote_node_device_lookup_by_name_/) and
+                !($call->{args} =~ m/^remote_node_device_create_xml_/)) {
                 $has_node_device = 1;
                 push(@vars_list, "virNodeDevicePtr dev = NULL");
                 push(@getters_list,
@@ -304,7 +306,7 @@ elsif ($opt_b) {
                      "        virNodeDeviceFree(dev);");
             }
 
-            foreach my $args_member (@{$calls{$_}->{args_members}}) {
+            foreach my $args_member (@{$call->{args_members}}) {
                 if ($args_member =~ m/^remote_nonnull_string name;/ and $has_node_device) {
                     # ignore the name arg for node devices
                     next
@@ -339,9 +341,9 @@ elsif ($opt_b) {
                         push(@args_list, "conn");
                     }
 
-                    if ($calls{$_}->{ProcName} eq "SecretSetValue") {
+                    if ($call->{ProcName} eq "SecretSetValue") {
                         push(@args_list, "(const unsigned char *)args->$2.$2_val");
-                    } elsif ($calls{$_}->{ProcName} eq "CPUBaseline") {
+                    } elsif ($call->{ProcName} eq "CPUBaseline") {
                         push(@args_list, "(const char **)args->$2.$2_val");
                     } else {
                         push(@args_list, "args->$2.$2_val");
@@ -395,13 +397,13 @@ elsif ($opt_b) {
         my $single_ret_list_max_define = "undefined";
         my $multi_ret = 0;
 
-        if ($calls{$_}->{ret} ne "void" and
-            scalar(@{$calls{$_}->{ret_members}}) > 1) {
+        if ($call->{ret} ne "void" and
+            scalar(@{$call->{ret_members}}) > 1) {
             $multi_ret = 1;
         }
 
-        if ($calls{$_}->{ret} ne "void") {
-            foreach my $ret_member (@{$calls{$_}->{ret_members}}) {
+        if ($call->{ret} ne "void") {
+            foreach my $ret_member (@{$call->{ret_members}}) {
                 if ($multi_ret) {
                     if ($ret_member =~ m/^(unsigned )?(char|short|int|hyper) (\S+)\[\S+\];/) {
                         push(@ret_list, "memcpy(ret->$3, tmp.$3, sizeof ret->$3);");
@@ -422,7 +424,7 @@ elsif ($opt_b) {
                     $single_ret_list_max_var = "max$1";
                     $single_ret_list_max_define = $2;
 
-                    if ($calls{$_}->{ProcName} eq "NodeListDevices") {
+                    if ($call->{ProcName} eq "NodeListDevices") {
                         my $conn = shift(@args_list);
                         my $cap = shift(@args_list);
                         unshift(@args_list, "ret->$1.$1_val");
@@ -470,12 +472,12 @@ elsif ($opt_b) {
                     push(@ret_list, "ret->$1 = $1;");
                     $single_ret_var = $1;
 
-                    if ($calls{$_}->{ProcName} =~ m/GetAutostart$/) {
+                    if ($call->{ProcName} =~ m/GetAutostart$/) {
                         $single_ret_by_ref = 1;
                     } else {
                         $single_ret_by_ref = 0;
 
-                        if ($calls{$_}->{ProcName} eq "CPUCompare") {
+                        if ($call->{ProcName} eq "CPUCompare") {
                             $single_ret_check = " == VIR_CPU_COMPARE_ERROR";
                         } else {
                             $single_ret_check = " < 0";
@@ -493,7 +495,7 @@ elsif ($opt_b) {
 
                     my $conn = shift(@args_list);
 
-                    if ($calls{$_}->{ProcName} eq "NodeGetCellsFreeMemory") {
+                    if ($call->{ProcName} eq "NodeGetCellsFreeMemory") {
                         $single_ret_check = " <= 0";
                         $single_ret_list_max_var = "maxCells";
                         unshift(@args_list, "(unsigned long long *)ret->$1.$1_val");
@@ -512,7 +514,7 @@ elsif ($opt_b) {
                     $type_name .= "long";
 
                     if ($type_name eq "long" and
-                        $calls{$_}->{ProcName} =~ m/^Get(Lib)?Version$/) {
+                        $call->{ProcName} =~ m/^Get(Lib)?Version$/) {
                         # SPECIAL: virConnectGet(Lib)?Version uses unsigned long
                         #          in public API but hyper in XDR protocol
                         $type_name = "unsigned long";
@@ -522,8 +524,8 @@ elsif ($opt_b) {
                     push(@ret_list, "ret->$ret_name = $ret_name;");
                     $single_ret_var = $ret_name;
 
-                    if ($calls{$_}->{ProcName} eq "DomainGetMaxMemory" or
-                        $calls{$_}->{ProcName} eq "NodeGetFreeMemory") {
+                    if ($call->{ProcName} eq "DomainGetMaxMemory" or
+                        $call->{ProcName} eq "NodeGetFreeMemory") {
                         # SPECIAL: virDomainGetMaxMemory and virNodeGetFreeMemory
                         #          return the actual value directly and 0 indicates
                         #          an error
@@ -546,17 +548,17 @@ elsif ($opt_b) {
                 push(@args_list, "conn");
             }
 
-            my $struct_name = $calls{$_}->{ProcName};
+            my $struct_name = $call->{ProcName};
             $struct_name =~ s/Get//;
 
-            if ($calls{$_}->{ProcName} eq "DomainGetBlockInfo") {
+            if ($call->{ProcName} eq "DomainGetBlockInfo") {
                 # SPECIAL: virDomainGetBlockInfo has flags parameter after
                 #          the struct parameter in its signature
                 my $flags = pop(@args_list);
                 push(@args_list, "&tmp");
                 push(@args_list, $flags);
-            } elsif ($calls{$_}->{ProcName} eq "DomainBlockStats" ||
-                     $calls{$_}->{ProcName} eq "DomainInterfaceStats") {
+            } elsif ($call->{ProcName} eq "DomainBlockStats" ||
+                     $call->{ProcName} eq "DomainInterfaceStats") {
                 # SPECIAL: virDomainBlockStats and virDomainInterfaceStats
                 #          have a 'Struct' suffix on the actual struct name
                 #          and take the struct size as additional argument
@@ -570,11 +572,11 @@ elsif ($opt_b) {
             push(@vars_list, "vir$struct_name tmp");
         }
 
-        if ($calls{$_}->{streamflag} ne "none") {
+        if ($call->{streamflag} ne "none") {
             my $first_arg = shift(@args_list);
             my $second_arg;
 
-            if ($calls{$_}->{ProcName} eq "DomainOpenConsole") {
+            if ($call->{ProcName} eq "DomainOpenConsole") {
                 # SPECIAL: virDomainOpenConsole differs and takes the stream
                 #          as third argument instead of the second
                 $second_arg = shift(@args_list);
@@ -597,22 +599,22 @@ elsif ($opt_b) {
         # print functions signature
         print "\n";
         print "static int\n";
-        print "${structprefix}Dispatch$calls{$_}->{ProcName}(\n";
+        print "${structprefix}Dispatch$call->{ProcName}(\n";
         print "    struct qemud_server *server ATTRIBUTE_UNUSED,\n";
         print "    struct qemud_client *client ATTRIBUTE_UNUSED,\n";
         print "    virConnectPtr conn,\n";
         print "    remote_message_header *hdr ATTRIBUTE_UNUSED,\n";
         print "    remote_error *rerr,\n";
-        print "    $calls{$_}->{args} *args";
+        print "    $call->{args} *args";
 
-        if ($calls{$_}->{args} eq "void") {
+        if ($call->{args} eq "void") {
             print " ATTRIBUTE_UNUSED"
         }
 
         print ",\n";
-        print "    $calls{$_}->{ret} *ret";
+        print "    $call->{ret} *ret";
 
-        if ($calls{$_}->{ret} eq "void") {
+        if ($call->{ret} eq "void") {
             print " ATTRIBUTE_UNUSED"
         }
 
@@ -626,7 +628,7 @@ elsif ($opt_b) {
             print "    $var;\n";
         }
 
-        if ($calls{$_}->{streamflag} ne "none") {
+        if ($call->{streamflag} ne "none") {
             print "    struct qemud_client_stream *stream = NULL;\n";
         }
 
@@ -660,42 +662,42 @@ elsif ($opt_b) {
             print "\n";
         }
 
-        if ($calls{$_}->{streamflag} ne "none") {
+        if ($call->{streamflag} ne "none") {
             print "    if (!(stream = remoteCreateClientStream(conn, hdr)))\n";
             print "        goto cleanup;\n";
             print "\n";
         }
 
-        if ($calls{$_}->{ret} eq "void") {
-            print "    if (vir$calls{$_}->{ProcName}(";
+        if ($call->{ret} eq "void") {
+            print "    if (vir$call->{ProcName}(";
             print join(', ', @args_list);
             print ") < 0)\n";
             print "        goto cleanup;\n";
             print "\n";
         } elsif (!$multi_ret) {
             my $prefix = "";
-            my $proc_name = $calls{$_}->{ProcName};
+            my $proc_name = $call->{ProcName};
 
             if (! @args_list) {
                 push(@args_list, "conn");
 
-                if ($calls{$_}->{ProcName} ne "NodeGetFreeMemory") {
+                if ($call->{ProcName} ne "NodeGetFreeMemory") {
                     $prefix = "Connect"
                 }
             }
 
-            if ($calls{$_}->{ProcName} eq "GetSysinfo" or
-                $calls{$_}->{ProcName} eq "GetMaxVcpus" or
-                $calls{$_}->{ProcName} eq "DomainXMLFromNative" or
-                $calls{$_}->{ProcName} eq "DomainXMLToNative" or
-                $calls{$_}->{ProcName} eq "FindStoragePoolSources" or
-                $calls{$_}->{ProcName} =~ m/^List/) {
+            if ($call->{ProcName} eq "GetSysinfo" or
+                $call->{ProcName} eq "GetMaxVcpus" or
+                $call->{ProcName} eq "DomainXMLFromNative" or
+                $call->{ProcName} eq "DomainXMLToNative" or
+                $call->{ProcName} eq "FindStoragePoolSources" or
+                $call->{ProcName} =~ m/^List/) {
                 $prefix = "Connect"
-            } elsif ($calls{$_}->{ProcName} eq "SupportsFeature") {
+            } elsif ($call->{ProcName} eq "SupportsFeature") {
                 $prefix = "Drv"
-            } elsif ($calls{$_}->{ProcName} eq "CPUBaseline") {
+            } elsif ($call->{ProcName} eq "CPUBaseline") {
                 $proc_name = "ConnectBaselineCPU"
-            } elsif ($calls{$_}->{ProcName} eq "CPUCompare") {
+            } elsif ($call->{ProcName} eq "CPUCompare") {
                 $proc_name = "ConnectCompareCPU"
             }
 
@@ -729,7 +731,7 @@ elsif ($opt_b) {
             print join("\n    ", @ret_list);
             print "\n";
         } else {
-            print "    if (vir$calls{$_}->{ProcName}(";
+            print "    if (vir$call->{ProcName}(";
             print join(', ', @args_list);
             print ") < 0)\n";
             print "        goto cleanup;\n";
@@ -743,10 +745,10 @@ elsif ($opt_b) {
             print "\n";
         }
 
-        if ($calls{$_}->{streamflag} ne "none") {
+        if ($call->{streamflag} ne "none") {
             print "    if (remoteAddClientStream(client, stream, ";
 
-            if ($calls{$_}->{streamflag} eq "write") {
+            if ($call->{streamflag} eq "write") {
                 print "0";
             } else {
                 print "1";
-- 
1.7.0.4




More information about the libvir-list mailing list