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.