| Index: base/trace_event/trace_log.cc
|
| diff --git a/base/trace_event/trace_log.cc b/base/trace_event/trace_log.cc
|
| index a9f99d41f0dc97b37a1cc7364c30231451047088..6dca8fafb25163a51d09977d679162dae3d9f9c2 100644
|
| --- a/base/trace_event/trace_log.cc
|
| +++ b/base/trace_event/trace_log.cc
|
| @@ -133,6 +133,47 @@ base::LazyInstance<
|
| std::list<std::unique_ptr<TraceLog::TraceEventFilter>>>::Leaky
|
| g_category_group_filter[MAX_CATEGORY_GROUPS] = {LAZY_INSTANCE_INITIALIZER};
|
|
|
| +// This filter is used to record trace events as pseudo stack for the heap
|
| +// profiler. It does not filter-out any events from the trace, ie. the behavior
|
| +// of trace events being added to TraceLog remains same: the events are added
|
| +// iff enabled for recording and not filtered-out by any other filter.
|
| +class HeapProfilerFilter : public TraceLog::TraceEventFilter {
|
| + public:
|
| + HeapProfilerFilter() {}
|
| +
|
| + bool FilterTraceEvent(const TraceEvent& trace_event) const override {
|
| + if (AllocationContextTracker::capture_mode() !=
|
| + AllocationContextTracker::CaptureMode::PSEUDO_STACK) {
|
| + return true;
|
| + }
|
| +
|
| + // TODO(primiano): Add support for events with copied name crbug.com/581079.
|
| + if (trace_event.flags() & TRACE_EVENT_FLAG_COPY)
|
| + return true;
|
| +
|
| + if (trace_event.phase() == TRACE_EVENT_PHASE_BEGIN ||
|
| + trace_event.phase() == TRACE_EVENT_PHASE_COMPLETE) {
|
| + AllocationContextTracker::GetInstanceForCurrentThread()
|
| + ->PushPseudoStackFrame(trace_event.name());
|
| + } else if (trace_event.phase() == TRACE_EVENT_PHASE_END) {
|
| + // The pop for |TRACE_EVENT_PHASE_COMPLETE| events is in |EndEvent|.
|
| + AllocationContextTracker::GetInstanceForCurrentThread()
|
| + ->PopPseudoStackFrame(trace_event.name());
|
| + }
|
| + // Do not filter-out any events and always return true. TraceLog adds the
|
| + // event only if it is enabled for recording.
|
| + return true;
|
| + }
|
| +
|
| + void EndEvent(const char* name, const char* category_group) override {
|
| + if (AllocationContextTracker::capture_mode() ==
|
| + AllocationContextTracker::CaptureMode::PSEUDO_STACK) {
|
| + AllocationContextTracker::GetInstanceForCurrentThread()
|
| + ->PopPseudoStackFrame(name);
|
| + }
|
| + }
|
| +};
|
| +
|
| TraceLog::TraceEventFilterConstructorForTesting
|
| g_trace_event_filter_constructor_for_testing = nullptr;
|
|
|
| @@ -539,9 +580,12 @@ void TraceLog::UpdateCategoryGroupEnabledFlag(size_t category_index) {
|
| if (event_filter.IsCategoryGroupEnabled(category_group)) {
|
| std::unique_ptr<TraceEventFilter> new_filter;
|
|
|
| - if (event_filter.predicate_name() == "event_whitelist_predicate") {
|
| - new_filter =
|
| - WrapUnique(new EventNameFilter(event_filter.filter_args()));
|
| + if (event_filter.predicate_name() ==
|
| + TraceEventFilter::kEventWhitelistPredicate) {
|
| + new_filter = MakeUnique<EventNameFilter>(event_filter.filter_args());
|
| + } else if (event_filter.predicate_name() ==
|
| + TraceEventFilter::kHeapProfilerPredicate) {
|
| + new_filter = MakeUnique<HeapProfilerFilter>();
|
| } else if (event_filter.predicate_name() == "testing_predicate") {
|
| CHECK(g_trace_event_filter_constructor_for_testing);
|
| new_filter = g_trace_event_filter_constructor_for_testing();
|
| @@ -1342,6 +1386,7 @@ TraceEventHandle TraceLog::AddTraceEventWithThreadIdAndTimestamp(
|
|
|
| std::string console_message;
|
| std::unique_ptr<TraceEvent> filtered_trace_event;
|
| + bool disabled_by_filters = false;
|
| if (*category_group_enabled & ENABLED_FOR_FILTERING) {
|
| std::unique_ptr<TraceEvent> new_trace_event(new TraceEvent);
|
| new_trace_event->Initialize(thread_id, offset_event_timestamp, thread_now,
|
| @@ -1352,21 +1397,20 @@ TraceEventHandle TraceLog::AddTraceEventWithThreadIdAndTimestamp(
|
| auto filter_list = GetCategoryGroupFilter(category_group_enabled);
|
| DCHECK(!filter_list->empty());
|
|
|
| - bool should_add_event = false;
|
| + disabled_by_filters = true;
|
| for (const auto& trace_event_filter : *filter_list) {
|
| if (trace_event_filter->FilterTraceEvent(*new_trace_event))
|
| - should_add_event = true;
|
| + disabled_by_filters = false;
|
| }
|
|
|
| - if (should_add_event)
|
| + if (!disabled_by_filters)
|
| filtered_trace_event = std::move(new_trace_event);
|
| }
|
|
|
| - // Add the trace event if we're either *just* recording (and not filtering)
|
| - // or if we one of our filters indicates the event should be added.
|
| - if (((*category_group_enabled & ENABLED_FOR_RECORDING) &&
|
| - (*category_group_enabled & ENABLED_FOR_FILTERING) == 0) ||
|
| - filtered_trace_event) {
|
| + // If enabled for recording, the event should be added only if one of the
|
| + // filters indicates or category is not enabled for filtering.
|
| + if ((*category_group_enabled & ENABLED_FOR_RECORDING) &&
|
| + !disabled_by_filters) {
|
| OptionalAutoLock lock(&lock_);
|
|
|
| TraceEvent* trace_event = NULL;
|
| @@ -1429,23 +1473,6 @@ TraceEventHandle TraceLog::AddTraceEventWithThreadIdAndTimestamp(
|
| }
|
| }
|
|
|
| - // TODO(primiano): Add support for events with copied name crbug.com/581078
|
| - if (!(flags & TRACE_EVENT_FLAG_COPY)) {
|
| - if (AllocationContextTracker::capture_mode() ==
|
| - AllocationContextTracker::CaptureMode::PSEUDO_STACK) {
|
| - if (phase == TRACE_EVENT_PHASE_BEGIN ||
|
| - phase == TRACE_EVENT_PHASE_COMPLETE) {
|
| - AllocationContextTracker::GetInstanceForCurrentThread()
|
| - ->PushPseudoStackFrame(name);
|
| - } else if (phase == TRACE_EVENT_PHASE_END) {
|
| - // The pop for |TRACE_EVENT_PHASE_COMPLETE| events
|
| - // is in |TraceLog::UpdateTraceEventDuration|.
|
| - AllocationContextTracker::GetInstanceForCurrentThread()
|
| - ->PopPseudoStackFrame(name);
|
| - }
|
| - }
|
| - }
|
| -
|
| return handle;
|
| }
|
|
|
| @@ -1577,13 +1604,6 @@ void TraceLog::UpdateTraceEventDuration(
|
| console_message =
|
| EventToConsoleMessage(TRACE_EVENT_PHASE_END, now, trace_event);
|
| }
|
| -
|
| - if (AllocationContextTracker::capture_mode() ==
|
| - AllocationContextTracker::CaptureMode::PSEUDO_STACK) {
|
| - // The corresponding push is in |AddTraceEventWithThreadIdAndTimestamp|.
|
| - AllocationContextTracker::GetInstanceForCurrentThread()
|
| - ->PopPseudoStackFrame(name);
|
| - }
|
| }
|
|
|
| if (!console_message.empty())
|
|
|