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 7e62064ec6a08e25fcdbc0f79cb3065ed36b1e4a..d77f865132316f17a300ce5fede1c8ea0c37c390 100644 |
--- a/base/trace_event/memory_dump_manager.cc |
+++ b/base/trace_event/memory_dump_manager.cc |
@@ -35,6 +35,7 @@ |
#include "base/trace_event/memory_dump_session_state.h" |
#include "base/trace_event/memory_infra_background_whitelist.h" |
#include "base/trace_event/memory_peak_detector.h" |
+#include "base/trace_event/memory_tracing_observer.h" |
#include "base/trace_event/process_memory_dump.h" |
#include "base/trace_event/trace_event.h" |
#include "base/trace_event/trace_event_argument.h" |
@@ -49,10 +50,6 @@ namespace trace_event { |
namespace { |
-const int kTraceEventNumArgs = 1; |
-const char* kTraceEventArgNames[] = {"dumps"}; |
-const unsigned char kTraceEventArgTypes[] = {TRACE_VALUE_TYPE_CONVERTABLE}; |
- |
StaticAtomicSequenceNumber g_next_guid; |
MemoryDumpManager* g_instance_for_testing = nullptr; |
@@ -198,7 +195,6 @@ MemoryDumpManager::MemoryDumpManager() |
} |
MemoryDumpManager::~MemoryDumpManager() { |
- TraceLog::GetInstance()->RemoveEnabledStateObserver(this); |
} |
void MemoryDumpManager::EnableHeapProfilingIfNeeded() { |
@@ -289,14 +285,8 @@ void MemoryDumpManager::Initialize( |
TraceLog::FILTERING_MODE); |
} |
- // If tracing was enabled before initializing MemoryDumpManager, we missed the |
- // OnTraceLogEnabled() event. Synthetize it so we can late-join the party. |
- // IsEnabled is called before adding observer to avoid calling |
- // OnTraceLogEnabled twice. |
- bool is_tracing_already_enabled = TraceLog::GetInstance()->IsEnabled(); |
- TraceLog::GetInstance()->AddEnabledStateObserver(this); |
- if (is_tracing_already_enabled) |
- OnTraceLogEnabled(); |
+ tracing_observer_ = |
+ MakeUnique<MemoryTracingObserver>(TraceLog::GetInstance(), this); |
} |
void MemoryDumpManager::RegisterDumpProvider( |
@@ -721,7 +711,6 @@ uint32_t MemoryDumpManager::GetDumpsSumKb(const std::string& pattern, |
return sum / 1024; |
} |
-// static |
void MemoryDumpManager::FinalizeDumpAndAddToTrace( |
std::unique_ptr<ProcessMemoryDumpAsyncState> pmd_async_state) { |
HEAP_PROFILER_SCOPED_IGNORE; |
@@ -732,7 +721,7 @@ void MemoryDumpManager::FinalizeDumpAndAddToTrace( |
pmd_async_state->callback_task_runner; |
callback_task_runner->PostTask( |
FROM_HERE, Bind(&MemoryDumpManager::FinalizeDumpAndAddToTrace, |
- Passed(&pmd_async_state))); |
+ Unretained(this), Passed(&pmd_async_state))); |
return; |
} |
@@ -742,26 +731,18 @@ void MemoryDumpManager::FinalizeDumpAndAddToTrace( |
// TODO(hjd): Transitional until we send the full PMD. See crbug.com/704203 |
MemoryDumpCallbackResult result; |
+ bool dump_successful = pmd_async_state->dump_successful; |
+ |
for (const auto& kv : pmd_async_state->process_dumps) { |
ProcessId pid = kv.first; // kNullProcessId for the current process. |
ProcessMemoryDump* process_memory_dump = kv.second.get(); |
- std::unique_ptr<TracedValue> traced_value(new TracedValue); |
- process_memory_dump->AsValueInto(traced_value.get()); |
- traced_value->SetString("level_of_detail", |
- MemoryDumpLevelOfDetailToString( |
- pmd_async_state->req_args.level_of_detail)); |
- const char* const event_name = |
- MemoryDumpTypeToString(pmd_async_state->req_args.dump_type); |
- |
- std::unique_ptr<ConvertableToTraceFormat> event_value( |
- std::move(traced_value)); |
- TRACE_EVENT_API_ADD_TRACE_EVENT_WITH_PROCESS_ID( |
- TRACE_EVENT_PHASE_MEMORY_DUMP, |
- TraceLog::GetCategoryGroupEnabled(kTraceCategory), event_name, |
- trace_event_internal::kGlobalScope, dump_guid, pid, |
- kTraceEventNumArgs, kTraceEventArgNames, |
- kTraceEventArgTypes, nullptr /* arg_values */, &event_value, |
- TRACE_EVENT_FLAG_HAS_ID); |
+ |
+ bool added_to_trace = tracing_observer_->AddDumpToTraceIfEnabled( |
+ &pmd_async_state->req_args, pid, process_memory_dump); |
+ |
+ // A dump only counts as successful if we also managed to add it to the |
Primiano Tucci (use gerrit)
2017/04/21 13:14:16
not sure we really need this comment. The nice thi
hjd
2017/04/21 13:42:32
Done.
|
+ // trace. |
+ dump_successful = dump_successful && added_to_trace; |
// TODO(hjd): Transitional until we send the full PMD. See crbug.com/704203 |
// Don't try to fill the struct in detailed mode since it is hard to avoid |
@@ -792,16 +773,8 @@ void MemoryDumpManager::FinalizeDumpAndAddToTrace( |
} |
} |
- bool tracing_still_enabled; |
- TRACE_EVENT_CATEGORY_GROUP_ENABLED(kTraceCategory, &tracing_still_enabled); |
- if (!tracing_still_enabled) { |
- pmd_async_state->dump_successful = false; |
- VLOG(1) << kLogPrefix << " failed because tracing was disabled before" |
- << " the dump was completed"; |
- } |
- |
if (!pmd_async_state->callback.is_null()) { |
- pmd_async_state->callback.Run(dump_guid, pmd_async_state->dump_successful); |
+ pmd_async_state->callback.Run(dump_guid, dump_successful); |
pmd_async_state->callback.Reset(); |
} |
@@ -809,17 +782,8 @@ void MemoryDumpManager::FinalizeDumpAndAddToTrace( |
TRACE_ID_LOCAL(dump_guid)); |
} |
-void MemoryDumpManager::OnTraceLogEnabled() { |
- bool enabled; |
- TRACE_EVENT_CATEGORY_GROUP_ENABLED(kTraceCategory, &enabled); |
- if (!enabled) |
- return; |
- |
- // Initialize the TraceLog for the current thread. This is to avoid that the |
- // TraceLog memory dump provider is registered lazily in the PostTask() below |
- // while the |lock_| is taken; |
- TraceLog::GetInstance()->InitializeThreadLocalEventBufferIfSupported(); |
- |
+void MemoryDumpManager::Enable( |
+ const TraceConfig::MemoryDumpConfig& memory_dump_config) { |
// Spin-up the thread used to invoke unbound dump providers. |
std::unique_ptr<Thread> dump_thread(new Thread("MemoryInfra")); |
if (!dump_thread->Start()) { |
@@ -827,10 +791,6 @@ void MemoryDumpManager::OnTraceLogEnabled() { |
return; |
} |
- const TraceConfig& trace_config = |
- TraceLog::GetInstance()->GetCurrentTraceConfig(); |
- const TraceConfig::MemoryDumpConfig& memory_dump_config = |
- trace_config.memory_dump_config(); |
scoped_refptr<MemoryDumpSessionState> session_state = |
new MemoryDumpSessionState; |
session_state->SetAllowedDumpModes(memory_dump_config.allowed_dump_modes); |
@@ -915,7 +875,7 @@ void MemoryDumpManager::OnTraceLogEnabled() { |
} |
} |
-void MemoryDumpManager::OnTraceLogDisabled() { |
+void MemoryDumpManager::Disable() { |
// There might be a memory dump in progress while this happens. Therefore, |
// ensure that the MDM state which depends on the tracing enabled / disabled |
// state is always accessed by the dumping methods holding the |lock_|. |