Reviewers: Michael Starzinger,

Description:
Add mutex when accessing concurrent recompilation output queue.

Also small refactorings.

[email protected]
BUG=291236

Please review this at https://codereview.chromium.org/23902033/

SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge

Affected files (+18, -6 lines):
  M src/execution.cc
  M src/optimizing-compiler-thread.h
  M src/optimizing-compiler-thread.cc


Index: src/execution.cc
diff --git a/src/execution.cc b/src/execution.cc
index 979641a9de53c1cd7ebfce9be9bf069699b0fe9f..35bb2f3eaa96dd4de91231298c5beca30d302344 100644
--- a/src/execution.cc
+++ b/src/execution.cc
@@ -952,7 +952,6 @@ MaybeObject* Execution::HandleStackGuardInterrupt(Isolate* isolate) {
   }
   if (stack_guard->IsInstallCodeRequest()) {
     ASSERT(FLAG_concurrent_recompilation);
-    stack_guard->Continue(INSTALL_CODE);
     isolate->optimizing_compiler_thread()->InstallOptimizedFunctions();
   }
   isolate->runtime_profiler()->OptimizeNow();
Index: src/optimizing-compiler-thread.cc
diff --git a/src/optimizing-compiler-thread.cc b/src/optimizing-compiler-thread.cc index 085143d99839e353b15b7793e606c05b78eff66f..f927cd2f84023f71f3ec0da578b87c6191e00d71 100644
--- a/src/optimizing-compiler-thread.cc
+++ b/src/optimizing-compiler-thread.cc
@@ -74,7 +74,6 @@ void OptimizingCompilerThread::Run() {
         { AllowHandleDereference allow_handle_dereference;
           FlushInputQueue(true);
         }
-        Release_Store(&queue_length_, static_cast<AtomicWord>(0));
         Release_Store(&stop_thread_, static_cast<AtomicWord>(CONTINUE));
         stop_semaphore_.Signal();
         // Return to start of consumer loop.
@@ -114,6 +113,7 @@ void OptimizingCompilerThread::CompileNext() {
     osr_candidates_.RemoveElement(optimizing_compiler);
     ready_for_osr_.Add(optimizing_compiler);
   } else {
+    LockGuard<Mutex> access_queue(&queue_mutex_);
     output_queue_.Enqueue(optimizing_compiler);
     isolate_->stack_guard()->RequestInstallCode();
   }
@@ -134,13 +134,20 @@ void OptimizingCompilerThread::FlushInputQueue(bool restore_function_code) {
     }
     delete info;
   }
+  Release_Store(&queue_length_, static_cast<AtomicWord>(0));
+
+  LockGuard<Mutex> access_osr_lists(&osr_list_mutex_);
+  osr_candidates_.Clear();
 }


void OptimizingCompilerThread::FlushOutputQueue(bool restore_function_code) {
   OptimizingCompiler* optimizing_compiler;
   // The optimizing compiler is allocated in the CompilationInfo's zone.
-  while (output_queue_.Dequeue(&optimizing_compiler)) {
+  while (true) {
+    { LockGuard<Mutex> access_queue(&queue_mutex_);
+      if (!output_queue_.Dequeue(&optimizing_compiler)) break;
+    }
     CompilationInfo* info = optimizing_compiler->info();
     if (restore_function_code) {
       Handle<JSFunction> function = info->closure();
@@ -149,7 +156,6 @@ void OptimizingCompilerThread::FlushOutputQueue(bool restore_function_code) {
     delete info;
   }

-  osr_candidates_.Clear();
   RemoveStaleOSRCandidates(0);
 }

@@ -196,9 +202,14 @@ void OptimizingCompilerThread::Stop() {
 void OptimizingCompilerThread::InstallOptimizedFunctions() {
   ASSERT(!IsOptimizerThread());
   HandleScope handle_scope(isolate_);
+
+  isolate_->stack_guard()->Continue(INSTALL_CODE);
+
   OptimizingCompiler* compiler;
   while (true) {
-    if (!output_queue_.Dequeue(&compiler)) return;
+    { LockGuard<Mutex> access_queue(&queue_mutex_);
+      if (!output_queue_.Dequeue(&optimizing_compiler)) break;
+    }
     Compiler::InstallOptimizedCode(compiler);
   }

Index: src/optimizing-compiler-thread.h
diff --git a/src/optimizing-compiler-thread.h b/src/optimizing-compiler-thread.h index d1ed6a2c59fada05467a2f1a4182710a9bef7976..42317657024fbc3ced25ec8381d231225728e29c 100644
--- a/src/optimizing-compiler-thread.h
+++ b/src/optimizing-compiler-thread.h
@@ -115,7 +115,7 @@ class OptimizingCompilerThread : public Thread {
   UnboundQueue<OptimizingCompiler*> input_queue_;
   // Queue of recompilation tasks ready to be installed (excluding OSR).
   UnboundQueue<OptimizingCompiler*> output_queue_;
- // List of all OSR related recompilation tasks (both incoming and ready ones).
+  // List of recompilation tasks for OSR in the input queue.
   List<OptimizingCompiler*> osr_candidates_;
   // List of recompilation tasks ready for OSR.
   List<OptimizingCompiler*> ready_for_osr_;
@@ -125,6 +125,8 @@ class OptimizingCompilerThread : public Thread {
   TimeDelta time_spent_compiling_;
   TimeDelta time_spent_total_;

+  // TODO(yangguo): remove this once the memory leak has been figured out.
+  Mutex queue_mutex_;
   Mutex osr_list_mutex_;
   int osr_hits_;
   int osr_attempts_;


--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to