summaryrefslogtreecommitdiff
path: root/deps/v8/src/optimizing-compiler-thread.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/optimizing-compiler-thread.cc')
-rw-r--r--deps/v8/src/optimizing-compiler-thread.cc67
1 files changed, 52 insertions, 15 deletions
diff --git a/deps/v8/src/optimizing-compiler-thread.cc b/deps/v8/src/optimizing-compiler-thread.cc
index 21ef237107..11d60c33d2 100644
--- a/deps/v8/src/optimizing-compiler-thread.cc
+++ b/deps/v8/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) {