Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(188)

Side by Side Diff: base/trace_event/memory_dump_manager.cc

Issue 2041583003: [tracing] Introduce "allowed_dump_modes" for memory dump config (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@background_config
Patch Set: Fixes and rebase. Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/trace_event/memory_dump_manager.h" 5 #include "base/trace_event/memory_dump_manager.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/atomic_sequence_num.h" 10 #include "base/atomic_sequence_num.h"
(...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after
331 // to just skip it, without actually invoking the |mdp|, which might be 331 // to just skip it, without actually invoking the |mdp|, which might be
332 // destroyed by the caller soon after this method returns. 332 // destroyed by the caller soon after this method returns.
333 (*mdp_iter)->disabled = true; 333 (*mdp_iter)->disabled = true;
334 dump_providers_.erase(mdp_iter); 334 dump_providers_.erase(mdp_iter);
335 } 335 }
336 336
337 void MemoryDumpManager::RequestGlobalDump( 337 void MemoryDumpManager::RequestGlobalDump(
338 MemoryDumpType dump_type, 338 MemoryDumpType dump_type,
339 MemoryDumpLevelOfDetail level_of_detail, 339 MemoryDumpLevelOfDetail level_of_detail,
340 const MemoryDumpCallback& callback) { 340 const MemoryDumpCallback& callback) {
341 // Bail out immediately if tracing is not enabled at all. 341 // Bail out immediately if tracing is not enabled at all or if the dump mode
342 if (!UNLIKELY(subtle::NoBarrier_Load(&memory_tracing_enabled_))) { 342 // is not allowed.
343 if (!UNLIKELY(subtle::NoBarrier_Load(&memory_tracing_enabled_)) ||
344 !IsDumpModeAllowed(level_of_detail)) {
343 VLOG(1) << kLogPrefix << " failed because " << kTraceCategory 345 VLOG(1) << kLogPrefix << " failed because " << kTraceCategory
344 << " tracing category is not enabled"; 346 << " tracing category is not enabled or the requested dump mode is "
347 "not allowed by trace config.";
345 if (!callback.is_null()) 348 if (!callback.is_null())
346 callback.Run(0u /* guid */, false /* success */); 349 callback.Run(0u /* guid */, false /* success */);
347 return; 350 return;
348 } 351 }
349 352
350 const uint64_t guid = 353 const uint64_t guid =
351 TraceLog::GetInstance()->MangleEventId(g_next_guid.GetNext()); 354 TraceLog::GetInstance()->MangleEventId(g_next_guid.GetNext());
352 355
353 // Creates an async event to keep track of the global dump evolution. 356 // Creates an async event to keep track of the global dump evolution.
354 // The |wrapped_callback| will generate the ASYNC_END event and then invoke 357 // The |wrapped_callback| will generate the ASYNC_END event and then invoke
(...skipping 352 matching lines...) Expand 10 before | Expand all | Expand 10 after
707 session_state_ = nullptr; 710 session_state_ = nullptr;
708 } 711 }
709 712
710 // Thread stops are blocking and must be performed outside of the |lock_| 713 // Thread stops are blocking and must be performed outside of the |lock_|
711 // or will deadlock (e.g., if SetupNextMemoryDump() tries to acquire it). 714 // or will deadlock (e.g., if SetupNextMemoryDump() tries to acquire it).
712 periodic_dump_timer_.Stop(); 715 periodic_dump_timer_.Stop();
713 if (dump_thread) 716 if (dump_thread)
714 dump_thread->Stop(); 717 dump_thread->Stop();
715 } 718 }
716 719
720 bool MemoryDumpManager::IsDumpModeAllowed(MemoryDumpLevelOfDetail dump_mode) {
721 AutoLock lock(lock_);
722 if (!session_state_)
723 return false;
724 return session_state_->memory_dump_config().allowed_dump_modes.count(
725 dump_mode) != 0;
726 }
727
717 uint64_t MemoryDumpManager::GetTracingProcessId() const { 728 uint64_t MemoryDumpManager::GetTracingProcessId() const {
718 return delegate_->GetTracingProcessId(); 729 return delegate_->GetTracingProcessId();
719 } 730 }
720 731
721 MemoryDumpManager::MemoryDumpProviderInfo::MemoryDumpProviderInfo( 732 MemoryDumpManager::MemoryDumpProviderInfo::MemoryDumpProviderInfo(
722 MemoryDumpProvider* dump_provider, 733 MemoryDumpProvider* dump_provider,
723 const char* name, 734 const char* name,
724 scoped_refptr<SequencedTaskRunner> task_runner, 735 scoped_refptr<SequencedTaskRunner> task_runner,
725 const MemoryDumpProvider::Options& options, 736 const MemoryDumpProvider::Options& options,
726 bool whitelisted_for_background_mode) 737 bool whitelisted_for_background_mode)
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
789 return; 800 return;
790 801
791 // At the moment the periodic support is limited to at most one periodic 802 // At the moment the periodic support is limited to at most one periodic
792 // trigger per dump mode. All intervals should be an integer multiple of the 803 // trigger per dump mode. All intervals should be an integer multiple of the
793 // smallest interval specified. 804 // smallest interval specified.
794 periodic_dumps_count_ = 0; 805 periodic_dumps_count_ = 0;
795 uint32_t min_timer_period_ms = std::numeric_limits<uint32_t>::max(); 806 uint32_t min_timer_period_ms = std::numeric_limits<uint32_t>::max();
796 uint32_t light_dump_period_ms = 0; 807 uint32_t light_dump_period_ms = 0;
797 uint32_t heavy_dump_period_ms = 0; 808 uint32_t heavy_dump_period_ms = 0;
798 DCHECK_LE(triggers_list.size(), 3u); 809 DCHECK_LE(triggers_list.size(), 3u);
810 auto mdm = MemoryDumpManager::GetInstance();
799 for (const TraceConfig::MemoryDumpConfig::Trigger& config : triggers_list) { 811 for (const TraceConfig::MemoryDumpConfig::Trigger& config : triggers_list) {
800 DCHECK_NE(0u, config.periodic_interval_ms); 812 DCHECK_NE(0u, config.periodic_interval_ms);
801 if (config.level_of_detail == MemoryDumpLevelOfDetail::LIGHT) { 813 switch (config.level_of_detail) {
802 DCHECK_EQ(0u, light_dump_period_ms); 814 case MemoryDumpLevelOfDetail::BACKGROUND:
803 light_dump_period_ms = config.periodic_interval_ms; 815 DCHECK(mdm->IsDumpModeAllowed(MemoryDumpLevelOfDetail::BACKGROUND));
804 } else if (config.level_of_detail == MemoryDumpLevelOfDetail::DETAILED) { 816 break;
805 DCHECK_EQ(0u, heavy_dump_period_ms); 817 case MemoryDumpLevelOfDetail::LIGHT:
806 heavy_dump_period_ms = config.periodic_interval_ms; 818 DCHECK_EQ(0u, light_dump_period_ms);
819 DCHECK(mdm->IsDumpModeAllowed(MemoryDumpLevelOfDetail::LIGHT));
820 light_dump_period_ms = config.periodic_interval_ms;
821 break;
822 case MemoryDumpLevelOfDetail::DETAILED:
823 DCHECK_EQ(0u, heavy_dump_period_ms);
824 DCHECK(mdm->IsDumpModeAllowed(MemoryDumpLevelOfDetail::DETAILED));
825 heavy_dump_period_ms = config.periodic_interval_ms;
826 break;
807 } 827 }
808 min_timer_period_ms = 828 min_timer_period_ms =
809 std::min(min_timer_period_ms, config.periodic_interval_ms); 829 std::min(min_timer_period_ms, config.periodic_interval_ms);
810 } 830 }
811 831
812 DCHECK_EQ(0u, light_dump_period_ms % min_timer_period_ms); 832 DCHECK_EQ(0u, light_dump_period_ms % min_timer_period_ms);
813 light_dump_rate_ = light_dump_period_ms / min_timer_period_ms; 833 light_dump_rate_ = light_dump_period_ms / min_timer_period_ms;
814 DCHECK_EQ(0u, heavy_dump_period_ms % min_timer_period_ms); 834 DCHECK_EQ(0u, heavy_dump_period_ms % min_timer_period_ms);
815 heavy_dump_rate_ = heavy_dump_period_ms / min_timer_period_ms; 835 heavy_dump_rate_ = heavy_dump_period_ms / min_timer_period_ms;
816 836
(...skipping 19 matching lines...) Expand all
836 if (heavy_dump_rate_ > 0 && periodic_dumps_count_ % heavy_dump_rate_ == 0) 856 if (heavy_dump_rate_ > 0 && periodic_dumps_count_ % heavy_dump_rate_ == 0)
837 level_of_detail = MemoryDumpLevelOfDetail::DETAILED; 857 level_of_detail = MemoryDumpLevelOfDetail::DETAILED;
838 ++periodic_dumps_count_; 858 ++periodic_dumps_count_;
839 859
840 MemoryDumpManager::GetInstance()->RequestGlobalDump( 860 MemoryDumpManager::GetInstance()->RequestGlobalDump(
841 MemoryDumpType::PERIODIC_INTERVAL, level_of_detail); 861 MemoryDumpType::PERIODIC_INTERVAL, level_of_detail);
842 } 862 }
843 863
844 } // namespace trace_event 864 } // namespace trace_event
845 } // namespace base 865 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698