Index: src/interpreter/interpreter.cc |
diff --git a/src/interpreter/interpreter.cc b/src/interpreter/interpreter.cc |
index 5b484cca78e1558c880bbf89b5f219243eb04ee6..5642a2c08e9c17ea1eb17e48fdb42184a20cd78c 100644 |
--- a/src/interpreter/interpreter.cc |
+++ b/src/interpreter/interpreter.cc |
@@ -44,6 +44,7 @@ class InterpreterCompilationJob final : public CompilationJob { |
BytecodeGenerator* generator() { return &generator_; } |
BytecodeGenerator generator_; |
+ RuntimeCallStats* runtime_call_stats_; |
DISALLOW_COPY_AND_ASSIGN(InterpreterCompilationJob); |
}; |
@@ -160,7 +161,9 @@ int Interpreter::InterruptBudget() { |
} |
InterpreterCompilationJob::InterpreterCompilationJob(CompilationInfo* info) |
- : CompilationJob(info->isolate(), info, "Ignition"), generator_(info) {} |
+ : CompilationJob(info->isolate(), info, "Ignition"), |
+ generator_(info), |
+ runtime_call_stats_(info->isolate()->counters()->runtime_call_stats()) {} |
InterpreterCompilationJob::Status InterpreterCompilationJob::PrepareJobImpl() { |
CodeGenerator::MakeCodePrologue(info(), "interpreter"); |
@@ -176,11 +179,14 @@ InterpreterCompilationJob::Status InterpreterCompilationJob::PrepareJobImpl() { |
} |
InterpreterCompilationJob::Status InterpreterCompilationJob::ExecuteJobImpl() { |
- // TODO(5203): These timers aren't thread safe, move to using the CompilerJob |
- // timers. |
- RuntimeCallTimerScope runtimeTimer(info()->isolate(), |
- &RuntimeCallStats::CompileIgnition); |
- TimerEventScope<TimerEventCompileIgnition> timer(info()->isolate()); |
+ if (FLAG_runtime_stats && executed_on_background_thread()) { |
+ // Create separate runtime stats for background compilation. |
+ runtime_call_stats_ = new (info()->zone()) RuntimeCallStats(); |
jochen (gone - plz use gerrit)
2016/12/16 10:47:38
this allocates a potentially pretty large object e
Camillo Bruni
2016/12/16 11:42:54
I think we initially discussed to do exactly that,
rmcilroy
2016/12/16 23:48:05
Yeah good point. I was basing this on the approach
|
+ } |
+ RuntimeCallTimerScope runtimeTimer( |
+ runtime_call_stats_, executed_on_background_thread() |
+ ? &RuntimeCallStats::CompileBackgroundIgnition |
+ : &RuntimeCallStats::CompileIgnition); |
TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8.compile"), "V8.CompileIgnition"); |
Camillo Bruni
2016/12/16 09:25:05
Please add: TODO(lpy): add support for background
rmcilroy
2016/12/16 23:48:05
Done.
|
generator()->GenerateBytecode(stack_limit()); |
@@ -192,6 +198,19 @@ InterpreterCompilationJob::Status InterpreterCompilationJob::ExecuteJobImpl() { |
} |
InterpreterCompilationJob::Status InterpreterCompilationJob::FinalizeJobImpl() { |
+ // Add background runtime call stats. |
+ if (executed_on_background_thread() && |
+ FLAG_runtime_stats == |
+ v8::tracing::TracingCategoryObserver::ENABLED_BY_NATIVE) { |
+ info()->isolate()->counters()->runtime_call_stats()->Add( |
+ runtime_call_stats_); |
+ // Reset runtime_call_stats_. |
+ runtime_call_stats_ = info()->isolate()->counters()->runtime_call_stats(); |
+ } |
+ |
+ RuntimeCallTimerScope runtimeTimer( |
+ runtime_call_stats_, &RuntimeCallStats::CompileIgnitionFinalization); |
+ |
Handle<BytecodeArray> bytecodes = generator()->FinalizeBytecode(isolate()); |
if (generator()->HasStackOverflow()) { |
return FAILED; |