diff options
author | Norbert Preining <norbert@preining.info> | 2024-05-01 21:19:47 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2024-05-01 21:19:47 +0900 |
commit | e639f648ceb97d20817700e8f5038678f968cf25 (patch) | |
tree | 45de55c9eea3b79fa775587b2486c077e9114ade | |
parent | 498fdabb5a2e7d5048c7adcc780821c8d04cdd0a (diff) |
fmtutil: run rebuild in parallel - code by Tiago de Pauladev/parallel-fmtutil
-rwxr-xr-x | Master/texmf-dist/scripts/texlive/fmtutil.pl | 55 |
1 files changed, 33 insertions, 22 deletions
diff --git a/Master/texmf-dist/scripts/texlive/fmtutil.pl b/Master/texmf-dist/scripts/texlive/fmtutil.pl index 63b0d6685ba..f99646ec1e6 100755 --- a/Master/texmf-dist/scripts/texlive/fmtutil.pl +++ b/Master/texmf-dist/scripts/texlive/fmtutil.pl @@ -38,6 +38,7 @@ use Getopt::Long qw(:config no_autoabbrev ignore_case_always); use File::Basename; use File::Spec; use Cwd; +use Parallel::ForkManager; # don't import anything automatically, this requires us to explicitly # call functions with TeXLive::TLUtils prefix, and makes it easier to @@ -469,38 +470,48 @@ sub callback_build_formats { my $nobuild = 0; my $notavail = 0; my $total = 0; + my $nproc = 24; # TODO should be dynamically tweaked to actual CPU + my $pm = Parallel::ForkManager->new($nproc); + $pm->run_on_finish(sub { + my ($pid, $exit_code, $ident, $exit_signal, $core_dump, $data_structure_reference) = @_; + my ($fmt, $eng) = @{$data_structure_reference}; + if ($exit_code == $FMT_DISABLED) { + log_to_status("DISABLED", $fmt, $eng, $what, $whatarg); + $disabled++; + } elsif ($exit_code == $FMT_NOTSELECTED) { + log_to_status("NOTSELECTED", $fmt, $eng, $what, $whatarg); + $nobuild++; + } elsif ($exit_code == $FMT_FAILURE) { + log_to_status("FAILURE", $fmt, $eng, $what, $whatarg); + $err++; + push (@err, "$eng/$fmt"); + } elsif ($exit_code == $FMT_SUCCESS) { + log_to_status("SUCCESS", $fmt, $eng, $what, $whatarg); + $suc++; + } elsif ($exit_code == $FMT_NOTAVAIL) { + log_to_status("NOTAVAIL", $fmt, $eng, $what, $whatarg); + $notavail++; + } + else { + log_to_status("UNKNOWN", $fmt, $eng, $what, $whatarg); + print_error("callback_build_format (round 1): unknown return " + . "from select_and_rebuild.\n"); + } + }); for my $swi (qw/format=engine format!=engine/) { for my $fmt (keys %{$alldata->{'merged'}}) { for my $eng (keys %{$alldata->{'merged'}{$fmt}}) { next if ($swi eq "format=engine" && $fmt ne $eng); next if ($swi eq "format!=engine" && $fmt eq $eng); $total++; + $pm->start("select_and_rebuild_format($fmt, $eng, $what, $whatarg)") and next; my $val = select_and_rebuild_format($fmt, $eng, $what, $whatarg); - if ($val == $FMT_DISABLED) { - log_to_status("DISABLED", $fmt, $eng, $what, $whatarg); - $disabled++; - } elsif ($val == $FMT_NOTSELECTED) { - log_to_status("NOTSELECTED", $fmt, $eng, $what, $whatarg); - $nobuild++; - } elsif ($val == $FMT_FAILURE) { - log_to_status("FAILURE", $fmt, $eng, $what, $whatarg); - $err++; - push (@err, "$eng/$fmt"); - } elsif ($val == $FMT_SUCCESS) { - log_to_status("SUCCESS", $fmt, $eng, $what, $whatarg); - $suc++; - } elsif ($val == $FMT_NOTAVAIL) { - log_to_status("NOTAVAIL", $fmt, $eng, $what, $whatarg); - $notavail++; - } - else { - log_to_status("UNKNOWN", $fmt, $eng, $what, $whatarg); - print_error("callback_build_format (round 1): unknown return " - . "from select_and_rebuild.\n"); - } + my @array = ($fmt, $eng); + $pm->finish($val, \@array); } } } + $pm->wait_all_children; # if the user asked to rebuild something, but we did nothing, report # unless we tried to rebuild only missing formats. |