| Index: src/optimizing-compiler-thread.cc
|
| diff --git a/src/optimizing-compiler-thread.cc b/src/optimizing-compiler-thread.cc
|
| index 11d60c33d203f0f460e8749724b7b093fb4f5324..21ef237107194d06a897110444c01710eae31bd0 100644
|
| --- a/src/optimizing-compiler-thread.cc
|
| +++ b/src/optimizing-compiler-thread.cc
|
| @@ -60,23 +60,12 @@ void OptimizingCompilerThread::Run() {
|
| OS::Sleep(FLAG_parallel_recompilation_delay);
|
| }
|
|
|
| - 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;
|
| + if (Acquire_Load(&stop_thread_)) {
|
| + stop_semaphore_->Signal();
|
| + if (FLAG_trace_parallel_recompilation) {
|
| + time_spent_total_ = OS::Ticks() - epoch;
|
| + }
|
| + return;
|
| }
|
|
|
| int64_t compiling_start = 0;
|
| @@ -113,41 +102,9 @@ 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>(STOP));
|
| + Release_Store(&stop_thread_, static_cast<AtomicWord>(true));
|
| input_queue_semaphore_->Signal();
|
| stop_semaphore_->Wait();
|
|
|
| @@ -157,8 +114,14 @@ void OptimizingCompilerThread::Stop() {
|
| while (NoBarrier_Load(&queue_length_) > 0) CompileNext();
|
| InstallOptimizedFunctions();
|
| } else {
|
| - FlushQueue(&input_queue_, false);
|
| - FlushQueue(&output_queue_, false);
|
| + 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();
|
| + }
|
| }
|
|
|
| if (FLAG_trace_parallel_recompilation) {
|
|
|