aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkActionFactory.java
diff options
context:
space:
mode:
authorGravatar brandjon <brandjon@google.com>2018-03-06 14:19:47 -0800
committerGravatar Copybara-Service <copybara-piper@google.com>2018-03-06 14:21:32 -0800
commit73f1a0a58d801026da23cffc4c844e0065323dc3 (patch)
tree046ebf20c29baf6b7ecc9783e5971602d22d4946 /src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkActionFactory.java
parente3cc481d5a0c53ad3574507ce43fdb6c9e71b30d (diff)
Make the builtins registry thread-safe
It was previously assumed that safety wasn't needed because 1) all builtins should be registered in static initializer blocks, and 2) all retrievals should occur during Skylark evaluation, after static initialization completes. It turns out these assumptions aren't actually true (Who would've thunk it!). SkylarkActionFactory has been observed to be initialized as late as analysis time, and retrievals occur as early as constructing a PackageFactory (when scanning the native module). The failure mode is particularly ugly: Random Skylark method lookups will fail non-deterministically. This change guards against this by making the builtins registry implement a form of freezing. Before freezing, reads and writes are allowed and are synchronized. After freezing, only reads are allowed and they are unsynchronized for performance. BlazeRuntime is responsible for flipping the bit, and for ensuring classes like SkylarkActionFactory run their initialization by that point. Unit tests don't need to worry, since they just stay unfrozen and synchronized throughout. RELNOTES: None PiperOrigin-RevId: 188080136
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkActionFactory.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkActionFactory.java12
1 files changed, 12 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkActionFactory.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkActionFactory.java
index e14bfc0046..914be9b43f 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkActionFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkActionFactory.java
@@ -1142,6 +1142,10 @@ public class SkylarkActionFactory implements SkylarkValue {
static {
SkylarkSignatureProcessor.configureSkylarkFunctions(Args.class);
}
+
+ /** No-op method that can be called to ensure the above static initializer runs. */
+ public static void forceStaticInitialization() {
+ }
}
@SkylarkSignature(
@@ -1185,4 +1189,12 @@ public class SkylarkActionFactory implements SkylarkValue {
static {
SkylarkSignatureProcessor.configureSkylarkFunctions(SkylarkActionFactory.class);
}
+
+ /**
+ * No-op method that can be called to ensure the above static initializer runs, as well as the
+ * initializer for nested classes.
+ */
+ public static void forceStaticInitialization() {
+ Args.forceStaticInitialization();
+ }
}