[padb-devel] [padb] r150 committed - Convert the rank handling code (-r) to use ranges everywhere. Now...

codesite-noreply at google.com codesite-noreply at google.com
Tue Aug 25 11:59:42 BST 2009


Revision: 150
Author: apittman
Date: Tue Aug 25 03:59:14 2009
Log: Convert the rank handling code (-r) to use ranges everywhere.  Now
padb can take rank ranges on the command line.

http://code.google.com/p/padb/source/detail?r=150

Modified:
  /trunk/src/padb

=======================================
--- /trunk/src/padb	Tue Aug 25 03:10:00 2009
+++ /trunk/src/padb	Tue Aug 25 03:59:14 2009
@@ -552,7 +552,8 @@
   
###############################################################################

  my $user = getpwuid($<);
-my @ranks;
+my $rank_rng;
+
  my @target_groups;
  my $all;
  my $any;
@@ -620,10 +621,12 @@
      Getopt::Long::Configure("bundling");
      my $debugflag;

+    my @ranks;
+
      my %optionhash = (
          "verbose|v+"          => \$conf{verbose},
          "user|u=s"            => \$user,
-        "rank|r=i"            => \@ranks,
+        "rank|r=s"            => \@ranks,
          "group-id=s"          => \@target_groups,
          "help|h"              => \&usage,
          "all|a"               => \$all,
@@ -689,6 +692,14 @@
          $mode = $arg;
          $have_allfns_option++;
      }
+
+    if (@ranks) {
+        $rank_rng = rng_convert_from_user( shift(@ranks) );
+
+        foreach my $rank (@ranks) {
+            rng_merge( $rank_rng, rng_convert_from_user($rank) );
+        }
+    }

      # Put the args in a hash so that they can be referenced by name.
      if ( defined $mode and defined $allfns{$mode}{secondary} ) {
@@ -1489,9 +1500,10 @@

          if ( $conf{stats_short} ) {
              my $new;
-            if ( $#ranks != -1 ) {
+            if ( defined $rank_rng ) {
                  my @ret;
-                foreach my $rank (@ranks) {
+                my $rng = rng_dup($rank_rng);
+                while ( defined( my $rank = rng_shift($rng) ) ) {
                      if ( defined $d->[$rank] ) {
                          push( @ret, summarise( $d->[$rank] ) );
                      } else {
@@ -1508,8 +1520,9 @@
              return;
          }

-        if ( $#ranks != -1 ) {
-            foreach my $rank (@ranks) {
+        if ( defined $rank_rng ) {
+            my $rng = rng_dup($rank_rng);
+            while ( defined( my $rank = rng_shift($rng) ) ) {
                  if ( defined $d->[$rank] ) {
                      print show_name $conf{stats_name}, $d->[$rank];
                  } else {
@@ -3349,8 +3362,8 @@

      # XXX: Should only send this list over if it makes sense, for example
      # the deadlock code only works when targetting all ranks.
-    if ( $#ranks != -1 ) {
-        @{ $req->{ranks} } = @ranks;
+    if ( defined $rank_rng ) {
+        $req->{ranks} = $rank_rng;
      }

      if ( defined $cmd->{out_format} ) {
@@ -3723,6 +3736,8 @@
                  splice( @{$rg}, $idx + 1, 1 );
              }
              return;
+        } elsif ( $value >= $part->{l} and $value <= $part->{u} ) {
+            confess("Failed to add value to range (Value already in  
range)");
          }
          $idx++;
      }
@@ -3739,6 +3754,11 @@
      }
      return;
  }
+
+sub rng_dup {
+    my ($rg) = @_;
+    return dclone($rg);
+}

  sub create_local_port {
      my ($range) = @_;
@@ -6819,11 +6839,13 @@
      # If supplied with a rank list then use it now to generate a list of
      # processes to inspect.
      if ( exists( $cmd->{ranks} ) ) {
-        my @ranks = @{ $cmd->{ranks} };
-        foreach my $proc ( @{ $confInner{all_pids} } ) {
-            my $vp  = $proc->{vp};
-            my $pid = $proc->{pid};
-            foreach my $rank (@ranks) {
+        my $rng = rng_dup( $cmd->{ranks} );
+
+        # Loop over ranks first as there are potentially more of them.
+        while ( defined( my $rank = rng_shift($rng) ) ) {
+            foreach my $proc ( @{ $confInner{all_pids} } ) {
+                my $vp  = $proc->{vp};
+                my $pid = $proc->{pid};
                  if ( $vp == $rank ) {
                      push @{$pid_list}, $proc;
                  }




More information about the padb-devel mailing list