| Index: src/optimizing-compiler-thread.cc
|
| diff --git a/src/optimizing-compiler-thread.cc b/src/optimizing-compiler-thread.cc
|
| index 21ef237107194d06a897110444c01710eae31bd0..11d60c33d203f0f460e8749724b7b093fb4f5324 100644
|
| --- a/src/optimizing-compiler-thread.cc
|
| +++ b/src/optimizing-compiler-thread.cc
|
| @@ -60,12 +60,23 @@ void OptimizingCompilerThread::Run() {
|
| OS::Sleep(FLAG_parallel_recompilation_delay);
|
| }
|
|
|
| - if (Acquire_Load(&stop_thread_)) {
|
| - stop_semaphore_->Signal();
|
| - if (FLAG_trace_parallel_recompilation) {
|
| - time_spent_total_ = OS::Ticks() - epoch;
|
| - }
|
| - return;
|
| + switch (static_cast<StopFlag>(Acquire_Load(&stop_thread_))) {
|
| + case CONTINUE:
|
| + break;
|
| + case STOP:
|
| + if (FLAG_trace_parallel_recompilation) {
|
| + time_spent_total_ = OS::Ticks() - epoch;
|
| + }
|
| + stop_semaphore_->Signal();
|
| + return;
|
| + case FLUSH:
|
| + // Reset input queue semaphore.
|
| + delete input_queue_semaphore_;
|
| + input_queue_semaphore_ = OS::CreateSemaphore(0);
|
| + // Signal for main thread to start flushing.
|
| + stop_semaphore_->Signal();
|
| + // Return to start of consumer loop.
|
| + continue;
|
| }
|
|
|
| int64_t compiling_start = 0;
|
| @@ -102,9 +113,41 @@ void OptimizingCompilerThread::CompileNext() {
|
| }
|
|
|
|
|
| +void OptimizingCompilerThread::FlushQueue(
|
| + UnboundQueue<OptimizingCompiler*>* queue,
|
| + bool restore_function_code) {
|
| + ASSERT(!IsOptimizerThread());
|
| + OptimizingCompiler* optimizing_compiler;
|
| + // The optimizing compiler is allocated in the CompilationInfo's zone.
|
| + while (queue->Dequeue(&optimizing_compiler)) {
|
| + CompilationInfo* info = optimizing_compiler->info();
|
| + if (restore_function_code) {
|
| + Handle<JSFunction> function = info->closure();
|
| + function->ReplaceCode(function->shared()->code());
|
| + }
|
| + delete info;
|
| + }
|
| +}
|
| +
|
| +
|
| +void OptimizingCompilerThread::Flush() {
|
| + ASSERT(!IsOptimizerThread());
|
| + Release_Store(&stop_thread_, static_cast<AtomicWord>(FLUSH));
|
| + input_queue_semaphore_->Signal();
|
| +
|
| + FlushQueue(&input_queue_, true);
|
| + NoBarrier_Store(&queue_length_, static_cast<AtomicWord>(0));
|
| +
|
| + stop_semaphore_->Wait();
|
| + Release_Store(&stop_thread_, static_cast<AtomicWord>(CONTINUE));
|
| +
|
| + FlushQueue(&output_queue_, true);
|
| +}
|
| +
|
| +
|
| void OptimizingCompilerThread::Stop() {
|
| ASSERT(!IsOptimizerThread());
|
| - Release_Store(&stop_thread_, static_cast<AtomicWord>(true));
|
| + Release_Store(&stop_thread_, static_cast<AtomicWord>(STOP));
|
| input_queue_semaphore_->Signal();
|
| stop_semaphore_->Wait();
|
|
|
| @@ -114,14 +157,8 @@ void OptimizingCompilerThread::Stop() {
|
| while (NoBarrier_Load(&queue_length_) > 0) CompileNext();
|
| InstallOptimizedFunctions();
|
| } else {
|
| - OptimizingCompiler* optimizing_compiler;
|
| - // The optimizing compiler is allocated in the CompilationInfo's zone.
|
| - while (input_queue_.Dequeue(&optimizing_compiler)) {
|
| - delete optimizing_compiler->info();
|
| - }
|
| - while (output_queue_.Dequeue(&optimizing_compiler)) {
|
| - delete optimizing_compiler->info();
|
| - }
|
| + FlushQueue(&input_queue_, false);
|
| + FlushQueue(&output_queue_, false);
|
| }
|
|
|
| if (FLAG_trace_parallel_recompilation) {
|
|
|