Index: src/log.cc |
diff --git a/src/log.cc b/src/log.cc |
index 0c1b76d7f42d6b3cc4e809517f89dba21f86586a..6c188f45b15f4f189b1479285b3ebc10bf0321da 100644 |
--- a/src/log.cc |
+++ b/src/log.cc |
@@ -957,38 +957,63 @@ void Logger::TickEvent(TickSample* sample, bool overflow) { |
} |
-bool Logger::IsProfilerPaused() { |
- return profiler_->paused(); |
+int Logger::GetActiveProfilerModules() { |
+ int result = PROFILER_MODULE_NONE; |
+ if (!profiler_->paused()) { |
+ result |= PROFILER_MODULE_CPU; |
+ } |
+ if (FLAG_log_gc) { |
+ result |= PROFILER_MODULE_HEAP_STATS | PROFILER_MODULE_JS_CONSTRUCTORS; |
+ } |
+ return result; |
} |
-void Logger::PauseProfiler() { |
- if (profiler_->paused()) { |
- return; |
+void Logger::PauseProfiler(int flags) { |
+ if (!Log::IsEnabled()) return; |
+ const int active_modules = GetActiveProfilerModules(); |
+ const int modules_to_disable = active_modules & flags; |
+ if (modules_to_disable == PROFILER_MODULE_NONE) return; |
+ |
+ if (modules_to_disable & PROFILER_MODULE_CPU) { |
+ profiler_->pause(); |
+ if (FLAG_prof_lazy) { |
+ if (!FLAG_sliding_state_window) ticker_->Stop(); |
+ FLAG_log_code = false; |
+ // Must be the same message as Log::kDynamicBufferSeal. |
+ LOG(UncheckedStringEvent("profiler", "pause")); |
+ } |
} |
- profiler_->pause(); |
- if (FLAG_prof_lazy) { |
- if (!FLAG_sliding_state_window) ticker_->Stop(); |
- FLAG_log_code = false; |
- // Must be the same message as Log::kDynamicBufferSeal. |
- LOG(UncheckedStringEvent("profiler", "pause")); |
+ if (modules_to_disable & |
+ (PROFILER_MODULE_HEAP_STATS | PROFILER_MODULE_JS_CONSTRUCTORS)) { |
+ FLAG_log_gc = false; |
+ } |
+ // Turn off logging if no active modules remain. |
+ if (active_modules & ~flags == PROFILER_MODULE_NONE) { |
+ is_logging_ = false; |
} |
- is_logging_ = false; |
} |
-void Logger::ResumeProfiler() { |
- if (!profiler_->paused() || !Log::IsEnabled()) { |
- return; |
+void Logger::ResumeProfiler(int flags) { |
+ if (!Log::IsEnabled()) return; |
+ const int modules_to_enable = ~GetActiveProfilerModules() & flags; |
+ if (modules_to_enable != PROFILER_MODULE_NONE) { |
+ is_logging_ = true; |
} |
- is_logging_ = true; |
- if (FLAG_prof_lazy) { |
- LOG(UncheckedStringEvent("profiler", "resume")); |
- FLAG_log_code = true; |
- LogCompiledFunctions(); |
- if (!FLAG_sliding_state_window) ticker_->Start(); |
+ if (modules_to_enable & PROFILER_MODULE_CPU) { |
+ if (FLAG_prof_lazy) { |
+ LOG(UncheckedStringEvent("profiler", "resume")); |
+ FLAG_log_code = true; |
+ LogCompiledFunctions(); |
+ if (!FLAG_sliding_state_window) ticker_->Start(); |
+ } |
+ profiler_->resume(); |
+ } |
+ if (modules_to_enable & |
+ (PROFILER_MODULE_HEAP_STATS | PROFILER_MODULE_JS_CONSTRUCTORS)) { |
+ FLAG_log_gc = true; |
} |
- profiler_->resume(); |
} |
@@ -996,7 +1021,7 @@ void Logger::ResumeProfiler() { |
// either from main or Profiler's thread. |
void Logger::StopLoggingAndProfiling() { |
Log::stop(); |
- PauseProfiler(); |
+ PauseProfiler(PROFILER_MODULE_CPU); |
} |