From 4fc00222cb5851e28e83d367f173038c7d026b03 Mon Sep 17 00:00:00 2001 From: Björn Stenberg Date: Fri, 24 Jul 2009 21:53:32 +0000 Subject: Dependency generation now uses all cores on multi-core machines. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@22021 a1c6a512-1295-4272-9138-f99709370657 --- tools/multigcc.pl | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100755 tools/multigcc.pl (limited to 'tools/multigcc.pl') diff --git a/tools/multigcc.pl b/tools/multigcc.pl new file mode 100755 index 0000000000..db544355ca --- /dev/null +++ b/tools/multigcc.pl @@ -0,0 +1,72 @@ +#!/usr/bin/perl +use List::Util 'shuffle'; # standard from Perl 5.8 and later + +my $tempfile = "multigcc.out"; +my @params; +my @files; +my $list = \@params; + +# parse command line arguments +for my $a (@ARGV) { + if ($a eq "--") { + $list = \@files; + next; + } + + push @{$list}, $a; +} + +my $command = join " ", @params; + +# shuffle the file list to spread the load as evenly as we can +@files = shuffle(@files); + +# count number of cores +my $cores = 1; +if (open CPUINFO, "; + close CPUINFO; +} + +# don't run empty children +if (scalar @files < $cores) +{ + $cores = 1; +} + +# fork children +my @pids; +my $slice = int((scalar @files / $cores) + 0.5); +for my $i (0 .. $cores-1) +{ + my $pid = fork; + if ($pid) + { + # mother + $pids[$i] = $pid; + } + else + { + # get my slice of the files + my @list = @files[$i * $slice .. $i * $slice + $slice - 1]; + + # run command + system("$command @list > $tempfile.$$"); + + exit; + } +} + +for my $i (0 .. $cores - 1) +{ + # wait for child to complete + waitpid $pids[$i], 0; + + # read & print result + if (open F, "<$tempfile.$pids[$i]") + { + print ; + close F; + unlink "$tempfile.$pids[$i]"; + } +} -- cgit v1.2.3