| Index: base/trace_event/memory_dump_manager.cc
|
| diff --git a/base/trace_event/memory_dump_manager.cc b/base/trace_event/memory_dump_manager.cc
|
| index d139454a1e85630454f519637c78a2f331e22cb6..906b0fcd444d8ab374c571d8f5293ecf0e81a801 100644
|
| --- a/base/trace_event/memory_dump_manager.cc
|
| +++ b/base/trace_event/memory_dump_manager.cc
|
| @@ -338,10 +338,13 @@ void MemoryDumpManager::RequestGlobalDump(
|
| MemoryDumpType dump_type,
|
| MemoryDumpLevelOfDetail level_of_detail,
|
| const MemoryDumpCallback& callback) {
|
| - // Bail out immediately if tracing is not enabled at all.
|
| - if (!UNLIKELY(subtle::NoBarrier_Load(&memory_tracing_enabled_))) {
|
| + // Bail out immediately if tracing is not enabled at all or if the dump mode
|
| + // is not allowed.
|
| + if (!UNLIKELY(subtle::NoBarrier_Load(&memory_tracing_enabled_)) ||
|
| + !IsDumpModeAllowed(level_of_detail)) {
|
| VLOG(1) << kLogPrefix << " failed because " << kTraceCategory
|
| - << " tracing category is not enabled";
|
| + << " tracing category is not enabled or the requested dump mode is "
|
| + "not allowed by trace config.";
|
| if (!callback.is_null())
|
| callback.Run(0u /* guid */, false /* success */);
|
| return;
|
| @@ -388,12 +391,20 @@ void MemoryDumpManager::CreateProcessDump(const MemoryDumpRequestArgs& args,
|
| std::unique_ptr<ProcessMemoryDumpAsyncState> pmd_async_state;
|
| {
|
| AutoLock lock(lock_);
|
| +
|
| // |dump_thread_| can be nullptr is tracing was disabled before reaching
|
| // here. SetupNextMemoryDump() is robust enough to tolerate it and will
|
| // NACK the dump.
|
| pmd_async_state.reset(new ProcessMemoryDumpAsyncState(
|
| args, dump_providers_, session_state_, callback,
|
| dump_thread_ ? dump_thread_->task_runner() : nullptr));
|
| +
|
| + // Safety check to prevent reaching here without calling RequestGlobalDump,
|
| + // with disallowed modes. If |session_state_| is null then tracing is
|
| + // disabled.
|
| + CHECK(!session_state_ ||
|
| + session_state_->memory_dump_config().allowed_dump_modes.count(
|
| + args.level_of_detail));
|
| }
|
|
|
| TRACE_EVENT_WITH_FLOW0(kTraceCategory, "MemoryDumpManager::CreateProcessDump",
|
| @@ -714,6 +725,14 @@ void MemoryDumpManager::OnTraceLogDisabled() {
|
| dump_thread->Stop();
|
| }
|
|
|
| +bool MemoryDumpManager::IsDumpModeAllowed(MemoryDumpLevelOfDetail dump_mode) {
|
| + AutoLock lock(lock_);
|
| + if (!session_state_)
|
| + return false;
|
| + return session_state_->memory_dump_config().allowed_dump_modes.count(
|
| + dump_mode) != 0;
|
| +}
|
| +
|
| uint64_t MemoryDumpManager::GetTracingProcessId() const {
|
| return delegate_->GetTracingProcessId();
|
| }
|
| @@ -796,14 +815,23 @@ void MemoryDumpManager::PeriodicGlobalDumpTimer::Start(
|
| uint32_t light_dump_period_ms = 0;
|
| uint32_t heavy_dump_period_ms = 0;
|
| DCHECK_LE(triggers_list.size(), 3u);
|
| + auto mdm = MemoryDumpManager::GetInstance();
|
| for (const TraceConfig::MemoryDumpConfig::Trigger& config : triggers_list) {
|
| DCHECK_NE(0u, config.periodic_interval_ms);
|
| - if (config.level_of_detail == MemoryDumpLevelOfDetail::LIGHT) {
|
| - DCHECK_EQ(0u, light_dump_period_ms);
|
| - light_dump_period_ms = config.periodic_interval_ms;
|
| - } else if (config.level_of_detail == MemoryDumpLevelOfDetail::DETAILED) {
|
| - DCHECK_EQ(0u, heavy_dump_period_ms);
|
| - heavy_dump_period_ms = config.periodic_interval_ms;
|
| + switch (config.level_of_detail) {
|
| + case MemoryDumpLevelOfDetail::BACKGROUND:
|
| + DCHECK(mdm->IsDumpModeAllowed(MemoryDumpLevelOfDetail::BACKGROUND));
|
| + break;
|
| + case MemoryDumpLevelOfDetail::LIGHT:
|
| + DCHECK_EQ(0u, light_dump_period_ms);
|
| + DCHECK(mdm->IsDumpModeAllowed(MemoryDumpLevelOfDetail::LIGHT));
|
| + light_dump_period_ms = config.periodic_interval_ms;
|
| + break;
|
| + case MemoryDumpLevelOfDetail::DETAILED:
|
| + DCHECK_EQ(0u, heavy_dump_period_ms);
|
| + DCHECK(mdm->IsDumpModeAllowed(MemoryDumpLevelOfDetail::DETAILED));
|
| + heavy_dump_period_ms = config.periodic_interval_ms;
|
| + break;
|
| }
|
| min_timer_period_ms =
|
| std::min(min_timer_period_ms, config.periodic_interval_ms);
|
|
|