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

Use mutex instead of busy wait when installing optimized function.

R=jkummerow@chromium.org
BUG=

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

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@15262 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 2e10e3e3
...@@ -89,8 +89,9 @@ void OptimizingCompilerThread::CompileNext() { ...@@ -89,8 +89,9 @@ void OptimizingCompilerThread::CompileNext() {
ASSERT(status != OptimizingCompiler::FAILED); ASSERT(status != OptimizingCompiler::FAILED);
// The function may have already been optimized by OSR. Simply continue. // 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 // Use a mutex to make sure that functions marked for install
// order: marking first and (after being queued) installing code second. // are always also queued.
ScopedLock mark_and_queue(install_mutex_);
{ Heap::RelocationLock relocation_lock(isolate_->heap()); { Heap::RelocationLock relocation_lock(isolate_->heap());
AllowHandleDereference ahd; AllowHandleDereference ahd;
optimizing_compiler->info()->closure()->MarkForInstallingRecompiledCode(); optimizing_compiler->info()->closure()->MarkForInstallingRecompiledCode();
...@@ -130,11 +131,13 @@ void OptimizingCompilerThread::Stop() { ...@@ -130,11 +131,13 @@ void OptimizingCompilerThread::Stop() {
void OptimizingCompilerThread::InstallOptimizedFunctions() { void OptimizingCompilerThread::InstallOptimizedFunctions() {
ASSERT(!IsOptimizerThread()); ASSERT(!IsOptimizerThread());
HandleScope handle_scope(isolate_); HandleScope handle_scope(isolate_);
int functions_installed = 0;
OptimizingCompiler* compiler; 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); Compiler::InstallOptimizedCode(compiler);
functions_installed++;
} }
} }
......
...@@ -50,6 +50,7 @@ class OptimizingCompilerThread : public Thread { ...@@ -50,6 +50,7 @@ class OptimizingCompilerThread : public Thread {
isolate_(isolate), isolate_(isolate),
stop_semaphore_(OS::CreateSemaphore(0)), stop_semaphore_(OS::CreateSemaphore(0)),
input_queue_semaphore_(OS::CreateSemaphore(0)), input_queue_semaphore_(OS::CreateSemaphore(0)),
install_mutex_(OS::CreateMutex()),
time_spent_compiling_(0), time_spent_compiling_(0),
time_spent_total_(0) { time_spent_total_(0) {
NoBarrier_Store(&stop_thread_, static_cast<AtomicWord>(false)); NoBarrier_Store(&stop_thread_, static_cast<AtomicWord>(false));
...@@ -95,6 +96,7 @@ class OptimizingCompilerThread : public Thread { ...@@ -95,6 +96,7 @@ class OptimizingCompilerThread : public Thread {
Semaphore* input_queue_semaphore_; Semaphore* input_queue_semaphore_;
UnboundQueue<OptimizingCompiler*> input_queue_; UnboundQueue<OptimizingCompiler*> input_queue_;
UnboundQueue<OptimizingCompiler*> output_queue_; UnboundQueue<OptimizingCompiler*> output_queue_;
Mutex* install_mutex_;
volatile AtomicWord stop_thread_; volatile AtomicWord stop_thread_;
volatile Atomic32 queue_length_; volatile Atomic32 queue_length_;
int64_t time_spent_compiling_; int64_t time_spent_compiling_;
......
...@@ -7912,12 +7912,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_InstallRecompiledCode) { ...@@ -7912,12 +7912,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_InstallRecompiledCode) {
ASSERT(args.length() == 1); ASSERT(args.length() == 1);
CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0);
ASSERT(V8::UseCrankshaft() && FLAG_parallel_recompilation); ASSERT(V8::UseCrankshaft() && FLAG_parallel_recompilation);
OptimizingCompilerThread* opt_thread = isolate->optimizing_compiler_thread(); isolate->optimizing_compiler_thread()->InstallOptimizedFunctions();
do {
// The function could have been marked for installing, but not queued just
// yet. In this case, retry until installed.
opt_thread->InstallOptimizedFunctions();
} while (function->IsMarkedForInstallingRecompiledCode());
return function->code(); return function->code();
} }
......
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