Commit ea5ab721 authored by yangguo@chromium.org's avatar yangguo@chromium.org

Add mutex when accessing concurrent recompilation output queue.

Also small refactorings.

R=mstarzinger@chromium.org
BUG=291236

Review URL: https://codereview.chromium.org/23902033

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@16740 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 42879d10
...@@ -952,7 +952,7 @@ MaybeObject* Execution::HandleStackGuardInterrupt(Isolate* isolate) { ...@@ -952,7 +952,7 @@ MaybeObject* Execution::HandleStackGuardInterrupt(Isolate* isolate) {
} }
if (stack_guard->IsInstallCodeRequest()) { if (stack_guard->IsInstallCodeRequest()) {
ASSERT(FLAG_concurrent_recompilation); ASSERT(FLAG_concurrent_recompilation);
stack_guard->Continue(INSTALL_CODE); isolate_->stack_guard()->Continue(INSTALL_CODE);
isolate->optimizing_compiler_thread()->InstallOptimizedFunctions(); isolate->optimizing_compiler_thread()->InstallOptimizedFunctions();
} }
isolate->runtime_profiler()->OptimizeNow(); isolate->runtime_profiler()->OptimizeNow();
......
...@@ -74,7 +74,6 @@ void OptimizingCompilerThread::Run() { ...@@ -74,7 +74,6 @@ void OptimizingCompilerThread::Run() {
{ AllowHandleDereference allow_handle_dereference; { AllowHandleDereference allow_handle_dereference;
FlushInputQueue(true); FlushInputQueue(true);
} }
Release_Store(&queue_length_, static_cast<AtomicWord>(0));
Release_Store(&stop_thread_, static_cast<AtomicWord>(CONTINUE)); Release_Store(&stop_thread_, static_cast<AtomicWord>(CONTINUE));
stop_semaphore_.Signal(); stop_semaphore_.Signal();
// Return to start of consumer loop. // Return to start of consumer loop.
...@@ -114,6 +113,7 @@ void OptimizingCompilerThread::CompileNext() { ...@@ -114,6 +113,7 @@ void OptimizingCompilerThread::CompileNext() {
osr_candidates_.RemoveElement(optimizing_compiler); osr_candidates_.RemoveElement(optimizing_compiler);
ready_for_osr_.Add(optimizing_compiler); ready_for_osr_.Add(optimizing_compiler);
} else { } else {
LockGuard<Mutex> access_queue(&queue_mutex_);
output_queue_.Enqueue(optimizing_compiler); output_queue_.Enqueue(optimizing_compiler);
isolate_->stack_guard()->RequestInstallCode(); isolate_->stack_guard()->RequestInstallCode();
} }
...@@ -134,13 +134,20 @@ void OptimizingCompilerThread::FlushInputQueue(bool restore_function_code) { ...@@ -134,13 +134,20 @@ void OptimizingCompilerThread::FlushInputQueue(bool restore_function_code) {
} }
delete info; 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) { void OptimizingCompilerThread::FlushOutputQueue(bool restore_function_code) {
OptimizingCompiler* optimizing_compiler; OptimizingCompiler* optimizing_compiler;
// The optimizing compiler is allocated in the CompilationInfo's zone. // 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(); CompilationInfo* info = optimizing_compiler->info();
if (restore_function_code) { if (restore_function_code) {
Handle<JSFunction> function = info->closure(); Handle<JSFunction> function = info->closure();
...@@ -149,7 +156,6 @@ void OptimizingCompilerThread::FlushOutputQueue(bool restore_function_code) { ...@@ -149,7 +156,6 @@ void OptimizingCompilerThread::FlushOutputQueue(bool restore_function_code) {
delete info; delete info;
} }
osr_candidates_.Clear();
RemoveStaleOSRCandidates(0); RemoveStaleOSRCandidates(0);
} }
...@@ -196,9 +202,12 @@ void OptimizingCompilerThread::Stop() { ...@@ -196,9 +202,12 @@ void OptimizingCompilerThread::Stop() {
void OptimizingCompilerThread::InstallOptimizedFunctions() { void OptimizingCompilerThread::InstallOptimizedFunctions() {
ASSERT(!IsOptimizerThread()); ASSERT(!IsOptimizerThread());
HandleScope handle_scope(isolate_); HandleScope handle_scope(isolate_);
OptimizingCompiler* compiler; OptimizingCompiler* compiler;
while (true) { while (true) {
if (!output_queue_.Dequeue(&compiler)) return; { LockGuard<Mutex> access_queue(&queue_mutex_);
if (!output_queue_.Dequeue(&optimizing_compiler)) break;
}
Compiler::InstallOptimizedCode(compiler); Compiler::InstallOptimizedCode(compiler);
} }
......
...@@ -115,7 +115,7 @@ class OptimizingCompilerThread : public Thread { ...@@ -115,7 +115,7 @@ class OptimizingCompilerThread : public Thread {
UnboundQueue<OptimizingCompiler*> input_queue_; UnboundQueue<OptimizingCompiler*> input_queue_;
// Queue of recompilation tasks ready to be installed (excluding OSR). // Queue of recompilation tasks ready to be installed (excluding OSR).
UnboundQueue<OptimizingCompiler*> output_queue_; 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<OptimizingCompiler*> osr_candidates_;
// List of recompilation tasks ready for OSR. // List of recompilation tasks ready for OSR.
List<OptimizingCompiler*> ready_for_osr_; List<OptimizingCompiler*> ready_for_osr_;
...@@ -125,6 +125,8 @@ class OptimizingCompilerThread : public Thread { ...@@ -125,6 +125,8 @@ class OptimizingCompilerThread : public Thread {
TimeDelta time_spent_compiling_; TimeDelta time_spent_compiling_;
TimeDelta time_spent_total_; TimeDelta time_spent_total_;
// TODO(yangguo): remove this once the memory leak has been figured out.
Mutex queue_mutex_;
Mutex osr_list_mutex_; Mutex osr_list_mutex_;
int osr_hits_; int osr_hits_;
int osr_attempts_; int osr_attempts_;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment