Index: src/optimizing-compiler-thread.cc |
diff --git a/src/optimizing-compiler-thread.cc b/src/optimizing-compiler-thread.cc |
index e092248b6f56613ee3b196bf08a0fd701bfade32..059179466aa6749b46c5fea8a118921c4128c196 100644 |
--- a/src/optimizing-compiler-thread.cc |
+++ b/src/optimizing-compiler-thread.cc |
@@ -89,8 +89,9 @@ void OptimizingCompilerThread::CompileNext() { |
ASSERT(status != OptimizingCompiler::FAILED); |
// The function may have already been optimized by OSR. Simply continue. |
- // Mark it for installing before queuing so that we can be sure of the write |
- // order: marking first and (after being queued) installing code second. |
+ // Use a mutex to make sure that functions marked for install |
+ // are always also queued. |
+ ScopedLock mark_and_queue(install_mutex_); |
{ Heap::RelocationLock relocation_lock(isolate_->heap()); |
AllowHandleDereference ahd; |
optimizing_compiler->info()->closure()->MarkForInstallingRecompiledCode(); |
@@ -127,11 +128,13 @@ void OptimizingCompilerThread::Stop() { |
void OptimizingCompilerThread::InstallOptimizedFunctions() { |
ASSERT(!IsOptimizerThread()); |
HandleScope handle_scope(isolate_); |
- int functions_installed = 0; |
OptimizingCompiler* compiler; |
- while (output_queue_.Dequeue(&compiler)) { |
+ while (true) { |
+ { // Memory barrier to ensure marked functions are queued. |
+ ScopedLock marked_and_queued(install_mutex_); |
+ if (!output_queue_.Dequeue(&compiler)) return; |
+ } |
Compiler::InstallOptimizedCode(compiler); |
- functions_installed++; |
} |
} |