Skip to content

Commit

Permalink
Protect %!loaded in CompUnit::PR::Default.
Browse files Browse the repository at this point in the history
  • Loading branch information
jnthn committed Feb 8, 2017
1 parent 71a1283 commit a88da2e
Showing 1 changed file with 15 additions and 6 deletions.
21 changes: 15 additions & 6 deletions src/core/CompUnit/PrecompilationRepository.pm
Expand Up @@ -24,6 +24,7 @@ class CompUnit { ... }
class CompUnit::PrecompilationRepository::Default does CompUnit::PrecompilationRepository {
has CompUnit::PrecompilationStore $.store;
my %loaded;
my $loaded-lock = Lock.new;
my $first-repo-id;

my $lle;
Expand All @@ -40,7 +41,9 @@ class CompUnit::PrecompilationRepository::Default does CompUnit::PrecompilationR
$RMD("try-load $id: $source") if $RMD;

# Even if we may no longer precompile, we should use already loaded files
return %loaded{$id} if %loaded{$id}:exists;
$loaded-lock.protect: {
return %loaded{$id} if %loaded{$id}:exists;
}

my ($handle, $checksum) = (
self.may-precomp and (
Expand Down Expand Up @@ -146,9 +149,11 @@ class CompUnit::PrecompilationRepository::Default does CompUnit::PrecompilationR
@dependencies.push: $dependency-precomp;
}

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

Expand Down Expand Up @@ -180,7 +185,9 @@ class CompUnit::PrecompilationRepository::Default does CompUnit::PrecompilationR
Instant :$since,
CompUnit::PrecompilationStore :@precomp-stores = Array[CompUnit::PrecompilationStore].new($.store),
) {
return %loaded{$id} if %loaded{$id}:exists;
$loaded-lock.protect: {
return %loaded{$id} if %loaded{$id}:exists;
}
my $RMD = $*RAKUDO_MODULE_DEBUG;
my $compiler-id = CompUnit::PrecompilationId.new($*PERL.compiler.id);
my $unit = self!load-file(@precomp-stores, $id);
Expand All @@ -189,7 +196,9 @@ class CompUnit::PrecompilationRepository::Default does CompUnit::PrecompilationR
if (not $since or $modified > $since)
and self!load-dependencies($unit, $modified, @precomp-stores)
{
return (%loaded{$id} = self!load-handle-for-path($unit)), $unit.checksum;
my \loaded = self!load-handle-for-path($unit);
$loaded-lock.protect: { %loaded{$id} = loaded };
return (loaded, $unit.checksum);
}
else {
if $*RAKUDO_MODULE_DEBUG -> $RMD {
Expand Down

0 comments on commit a88da2e

Please sign in to comment.