Skip to content

Commit

Permalink
De-hllize loaded hash in CompUnit::PrecompilationRepository
Browse files Browse the repository at this point in the history
Reduce overhead of HLL access that will never be optimized away.
  • Loading branch information
lizmat committed Mar 10, 2020
1 parent 95e8906 commit 5271d12
Showing 1 changed file with 20 additions and 12 deletions.
32 changes: 20 additions & 12 deletions src/core.c/CompUnit/PrecompilationRepository.pm6
Expand Up @@ -26,7 +26,7 @@ class CompUnit::PrecompilationRepository::Default

method TWEAK() { $!RMD := $*RAKUDO_MODULE_DEBUG }

my %loaded;
my $loaded := nqp::hash;
my $resolved := nqp::hash;
my $loaded-lock := Lock.new;
my $first-repo-id;
Expand Down Expand Up @@ -60,13 +60,15 @@ class CompUnit::PrecompilationRepository::Default

# Even if we may no longer precompile, we should use already loaded files
$loaded-lock.protect: {
return %loaded{$id} if %loaded{$id}:exists;
if nqp::atkey($loaded,$id.Str) -> \precomped {
return precomped;
}
}

my ($handle, $checksum) = (
self.may-precomp and (
my $loaded = self.load($id, :source($source), :checksum($dependency.checksum), :@precomp-stores) # already precompiled?
or self.precompile($source, $id, :source-name($dependency.source-name), :force($loaded ~~ Failure), :@precomp-stores)
my $precomped := self.load($id, :source($source), :checksum($dependency.checksum), :@precomp-stores) # already precompiled?
or self.precompile($source, $id, :source-name($dependency.source-name), :force(nqp::hllbool(nqp::istype($precomped,Failure))), :@precomp-stores)
and self.load($id, :@precomp-stores) # if not do it now
)
);
Expand Down Expand Up @@ -209,10 +211,12 @@ Need to re-check dependencies.")

$loaded-lock.protect: {
for @dependencies -> $dependency-precomp {
unless %loaded{$dependency-precomp.id}:exists {
%loaded{$dependency-precomp.id} =
self!load-handle-for-path($dependency-precomp);
}
nqp::bindkey(
$loaded,
$dependency-precomp.id.Str,
self!load-handle-for-path($dependency-precomp)
) unless nqp::existskey($loaded,$dependency-precomp.id.Str);

$dependency-precomp.close;
}
}
Expand Down Expand Up @@ -266,7 +270,9 @@ Need to re-check dependencies.")
Array[CompUnit::PrecompilationStore].new($.store),
) {
$loaded-lock.protect: {
return %loaded{$id} if %loaded{$id}:exists;
if nqp::atkey($loaded,$id.Str) -> \precomped {
return precomped;
}
}

if self!load-file(@precomp-stores, $id) -> $unit {
Expand All @@ -275,10 +281,12 @@ Need to re-check dependencies.")
and self!load-dependencies($unit, @precomp-stores)
{
my $unit-checksum := $unit.checksum;
my \loaded := self!load-handle-for-path($unit);
my $precomped := self!load-handle-for-path($unit);
$unit.close;
$loaded-lock.protect: { %loaded{$id} = loaded };
(loaded, $unit-checksum)
$loaded-lock.protect: {
nqp::bindkey($loaded,$id.Str,$precomped)
}
($precomped, $unit-checksum)
}
else {
$!RMD("Outdated precompiled {$unit}{
Expand Down

0 comments on commit 5271d12

Please sign in to comment.