Index: runtime/vm/compiler.cc |
diff --git a/runtime/vm/compiler.cc b/runtime/vm/compiler.cc |
index 64bb5ad9e6026e5b509ec0e2e4868830bca252b0..50e2e554e72b10ce0e1e23953c8a87a71cf267bc 100644 |
--- a/runtime/vm/compiler.cc |
+++ b/runtime/vm/compiler.cc |
@@ -1452,10 +1452,12 @@ NOT_IN_PRODUCT( |
TIMELINE_FUNCTION_COMPILATION_DURATION(thread, event_name, function); |
) // !PRODUCT |
- // Optimization must happen in non-mutator/Dart thread if background |
- // compilation is on. OSR compilation still occurs in the main thread. |
- ASSERT((osr_id != kNoOSRDeoptId) || !FLAG_background_compilation || |
- !thread->IsMutatorThread()); |
+ // If we are in the optimizing in the mutator/Dart thread, then |
+ // this is either an OSR compilation or background compilation is |
+ // not currently allowed. |
+ ASSERT(!thread->IsMutatorThread() || |
+ (osr_id != kNoOSRDeoptId) || |
+ !FLAG_background_compilation || BackgroundCompiler::IsDisabled()); |
CompilationPipeline* pipeline = |
CompilationPipeline::New(thread->zone(), function); |
return CompileFunctionHelper(pipeline, |
@@ -1563,7 +1565,10 @@ RawObject* Compiler::EvaluateStaticInitializer(const Field& field) { |
// evaluating the initializer value. |
ASSERT(field.StaticValue() == Object::transition_sentinel().raw()); |
LongJumpScope jump; |
+ Thread* thread = Thread::Current(); |
if (setjmp(*jump.Set()) == 0) { |
+ NoOOBMessageScope no_msg_scope(thread); |
+ NoReloadScope no_reload_scope(thread->isolate(), thread); |
// Under lazy compilation initializer has not yet been created, so create |
// it now, but don't bother remembering it because it won't be used again. |
ASSERT(!field.HasPrecompiledInitializer()); |
@@ -1621,6 +1626,10 @@ RawObject* Compiler::ExecuteOnce(SequenceNode* fragment) { |
// Don't allow message interrupts while executing constant |
// expressions. They can cause bogus recursive compilation. |
NoOOBMessageScope no_msg_scope(thread); |
+ |
+ // Don't allow reload requests to come in. |
+ NoReloadScope no_reload_scope(thread->isolate(), thread); |
+ |
if (FLAG_trace_compiler) { |
THR_Print("compiling expression: "); |
if (FLAG_support_ast_printer) { |
@@ -1975,6 +1984,41 @@ void BackgroundCompiler::Stop(Isolate* isolate) { |
} |
+void BackgroundCompiler::Disable() { |
+ Thread* thread = Thread::Current(); |
+ ASSERT(thread != NULL); |
+ Isolate* isolate = thread->isolate(); |
+ MutexLocker ml(isolate->mutex()); |
+ BackgroundCompiler* task = isolate->background_compiler(); |
+ if (task != NULL) { |
+ // We should only ever have to stop the task if this is the first call to |
+ // Disable. |
+ ASSERT(!isolate->is_background_compiler_disabled()); |
+ BackgroundCompiler::Stop(isolate); |
+ } |
+ ASSERT(isolate->background_compiler() == NULL); |
+ isolate->disable_background_compiler(); |
+} |
+ |
+ |
+bool BackgroundCompiler::IsDisabled() { |
+ Thread* thread = Thread::Current(); |
+ ASSERT(thread != NULL); |
+ Isolate* isolate = thread->isolate(); |
+ MutexLocker ml(isolate->mutex()); |
+ return isolate->is_background_compiler_disabled(); |
+} |
+ |
+ |
+void BackgroundCompiler::Enable() { |
+ Thread* thread = Thread::Current(); |
+ ASSERT(thread != NULL); |
+ Isolate* isolate = thread->isolate(); |
+ MutexLocker ml(isolate->mutex()); |
+ isolate->enable_background_compiler(); |
+} |
+ |
+ |
void BackgroundCompiler::EnsureInit(Thread* thread) { |
ASSERT(thread->IsMutatorThread()); |
// Finalize NoSuchMethodError, _Mint; occasionally needed in optimized |
@@ -2126,6 +2170,22 @@ void BackgroundCompiler::EnsureInit(Thread* thread) { |
UNREACHABLE(); |
} |
+ |
+void BackgroundCompiler::Disable() { |
+ UNREACHABLE(); |
+} |
+ |
+ |
+void BackgroundCompiler::Enable() { |
+ UNREACHABLE(); |
+} |
+ |
+ |
+bool BackgroundCompiler::IsDisabled() { |
+ UNREACHABLE(); |
+ return true; |
+} |
+ |
#endif // DART_PRECOMPILED_RUNTIME |
} // namespace dart |