This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
In bisect{,-runner}.pl, refactor the code for CPU probing and make jobs.
authorNicholas Clark <nick@ccl4.org>
Tue, 10 Apr 2012 08:37:41 +0000 (10:37 +0200)
committerNicholas Clark <nick@ccl4.org>
Tue, 28 May 2013 07:19:27 +0000 (09:19 +0200)
Move the code that attempts various ways to probe for the number of CPUs
from bisect-runner.pl to bisect.pl. Skip the probe entirely if a -j (--jobs)
options is passed to bisect.pl. For --jobs=0 (or -j0) entirely skip adding
-j to the make command line. (For heretical versions of make which don't use
-j for parallelism).

Previously the probe code always ran for each call to bisect-runner.pl,
which is completely redundant if bisect-runner.pl is being called for
argument validation or help text, and inefficient even when building, as the
number of CPUs rarely changes during a bisect run. Additionally there was no
way to avoid a -j in the make command line, which isn't going to fly on
systems where the make utility doesn't have a -j option.

Porting/bisect-runner.pl
Porting/bisect.pl

index 5779606..8797e9a 100755 (executable)
@@ -9,20 +9,8 @@ use Carp;
 my @targets
     = qw(config.sh config.h miniperl lib/Config.pm Fcntl perl test_prep);
 
-my $cpus;
-if (open my $fh, '<', '/proc/cpuinfo') {
-    while (<$fh>) {
-        ++$cpus if /^processor\s+:\s+\d+$/;
-    }
-} elsif (-x '/sbin/sysctl') {
-    $cpus = 1 + $1 if `/sbin/sysctl hw.ncpu` =~ /^hw\.ncpu: (\d+)$/;
-} elsif (-x '/usr/bin/getconf') {
-    $cpus = 1 + $1 if `/usr/bin/getconf _NPROCESSORS_ONLN` =~ /^(\d+)$/;
-}
-
 my %options =
     (
-     jobs => defined $cpus ? $cpus + 1 : 2,
      'expect-pass' => 1,
      clean => 1, # mostly for debugging this
     );
@@ -82,7 +70,7 @@ unless(GetOptions(\%options,
     pod2usage(exitval => 255, verbose => 1);
 }
 
-my ($target, $j, $match) = @options{qw(target jobs match)};
+my ($target, $match) = @options{qw(target match)};
 
 @ARGV = ('sh', '-c', 'cd t && ./perl TEST base/*.t')
     if $options{validate} && !@ARGV;
@@ -536,7 +524,7 @@ unless (exists $defines{cc}) {
     $defines{cc} = (`ccache -V`, $?) ? 'cc' : 'ccache cc';
 }
 
-$j = "-j$j" if $j =~ /\A\d+\z/;
+my $j = $options{jobs} ? "-j$options{jobs}" : '';
 
 if (exists $options{make}) {
     if (!exists $defines{make}) {
index 29e3ded..7c0ba07 100755 (executable)
@@ -11,8 +11,8 @@ Documentation for this is in bisect-runner.pl
 # Which isn't what we want.
 use Getopt::Long qw(:config pass_through no_auto_abbrev);
 
-my ($start, $end, $validate, $usage, $bad);
-$bad = !GetOptions('start=s' => \$start, 'end=s' => \$end,
+my ($start, $end, $validate, $usage, $bad, $jobs);
+$bad = !GetOptions('start=s' => \$start, 'end=s' => \$end, 'jobs|j=i' => \$jobs,
                    validate => \$validate, 'usage|help|?' => \$usage);
 unshift @ARGV, '--help' if $bad || $usage;
 unshift @ARGV, '--validate' if $validate;
@@ -36,6 +36,23 @@ exit 0 if $usage;
 
 my $start_time = time;
 
+if (!defined $jobs) {
+    # Try to default to (ab)use all the CPUs:
+    my $cpus;
+    if (open my $fh, '<', '/proc/cpuinfo') {
+        while (<$fh>) {
+            ++$cpus if /^processor\s+:\s+\d+$/;
+        }
+    } elsif (-x '/sbin/sysctl') {
+        $cpus =  $1 if `/sbin/sysctl hw.ncpu` =~ /^hw\.ncpu: (\d+)$/;
+    } elsif (-x '/usr/bin/getconf') {
+        $cpus = $1 if `/usr/bin/getconf _NPROCESSORS_ONLN` =~ /^(\d+)$/;
+    }
+    $jobs = defined $cpus ? $cpus + 1 : 2;
+}
+
+unshift @ARGV, '--jobs', $jobs;
+
 # We try these in this order for the start revision if none is specified.
 my @stable = qw(perl-5.005 perl-5.6.0 perl-5.8.0 v5.10.0 v5.12.0 v5.14.0);