OLD | NEW |
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/trace_log.h" | 5 #include "base/trace_event/trace_log.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <cmath> | 8 #include <cmath> |
9 #include <memory> | 9 #include <memory> |
10 #include <utility> | 10 #include <utility> |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
126 } | 126 } |
127 | 127 |
128 private: | 128 private: |
129 std::unordered_set<std::string> whitelist_; | 129 std::unordered_set<std::string> whitelist_; |
130 }; | 130 }; |
131 | 131 |
132 base::LazyInstance< | 132 base::LazyInstance< |
133 std::list<std::unique_ptr<TraceLog::TraceEventFilter>>>::Leaky | 133 std::list<std::unique_ptr<TraceLog::TraceEventFilter>>>::Leaky |
134 g_category_group_filter[MAX_CATEGORY_GROUPS] = {LAZY_INSTANCE_INITIALIZER}; | 134 g_category_group_filter[MAX_CATEGORY_GROUPS] = {LAZY_INSTANCE_INITIALIZER}; |
135 | 135 |
| 136 class HeapProfilerFilter : public TraceLog::TraceEventFilter { |
| 137 public: |
| 138 HeapProfilerFilter() {} |
| 139 |
| 140 bool FilterTraceEvent(const TraceEvent& trace_event) const override { |
| 141 // TODO(primiano): Add support for events with copied name crbug.com/581078 |
| 142 if (!(trace_event.flags() & TRACE_EVENT_FLAG_COPY)) { |
| 143 if (AllocationContextTracker::capture_mode() == |
| 144 AllocationContextTracker::CaptureMode::PSEUDO_STACK) { |
| 145 if (trace_event.phase() == TRACE_EVENT_PHASE_BEGIN || |
| 146 trace_event.phase() == TRACE_EVENT_PHASE_COMPLETE) { |
| 147 AllocationContextTracker::GetInstanceForCurrentThread() |
| 148 ->PushPseudoStackFrame(trace_event.name()); |
| 149 } else if (trace_event.phase() == TRACE_EVENT_PHASE_END) |
| 150 // The pop for |TRACE_EVENT_PHASE_COMPLETE| events is in |EndEvent|. |
| 151 AllocationContextTracker::GetInstanceForCurrentThread() |
| 152 ->PopPseudoStackFrame(trace_event.name()); |
| 153 } |
| 154 } |
| 155 // This predicate does not filter any events, but only records the events. |
| 156 // So, it should return true iff the category is enabled for recoding. |
| 157 return (*trace_event.category_group_enabled() & |
| 158 TraceLog::ENABLED_FOR_RECORDING); |
| 159 } |
| 160 void EndEvent(const char* name, const char* category_group) override { |
| 161 AllocationContextTracker::GetInstanceForCurrentThread() |
| 162 ->PopPseudoStackFrame(name); |
| 163 } |
| 164 }; |
| 165 |
136 TraceLog::TraceEventFilterConstructorForTesting | 166 TraceLog::TraceEventFilterConstructorForTesting |
137 g_trace_event_filter_constructor_for_testing = nullptr; | 167 g_trace_event_filter_constructor_for_testing = nullptr; |
138 | 168 |
139 // Indexes here have to match the g_category_groups array indexes above. | 169 // Indexes here have to match the g_category_groups array indexes above. |
140 const int kCategoryAlreadyShutdown = 1; | 170 const int kCategoryAlreadyShutdown = 1; |
141 const int kCategoryCategoriesExhausted = 2; | 171 const int kCategoryCategoriesExhausted = 2; |
142 const int kCategoryMetadata = 3; | 172 const int kCategoryMetadata = 3; |
143 const int kNumBuiltinCategories = 4; | 173 const int kNumBuiltinCategories = 4; |
144 // Skip default categories. | 174 // Skip default categories. |
145 base::subtle::AtomicWord g_category_index = kNumBuiltinCategories; | 175 base::subtle::AtomicWord g_category_index = kNumBuiltinCategories; |
(...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
535 if (!(g_category_group_filter[category_index] == nullptr)) | 565 if (!(g_category_group_filter[category_index] == nullptr)) |
536 g_category_group_filter[category_index].Get().clear(); | 566 g_category_group_filter[category_index].Get().clear(); |
537 | 567 |
538 for (const auto& event_filter : trace_config_.event_filters()) { | 568 for (const auto& event_filter : trace_config_.event_filters()) { |
539 if (event_filter.IsCategoryGroupEnabled(category_group)) { | 569 if (event_filter.IsCategoryGroupEnabled(category_group)) { |
540 std::unique_ptr<TraceEventFilter> new_filter; | 570 std::unique_ptr<TraceEventFilter> new_filter; |
541 | 571 |
542 if (event_filter.predicate_name() == "event_whitelist_predicate") { | 572 if (event_filter.predicate_name() == "event_whitelist_predicate") { |
543 new_filter = | 573 new_filter = |
544 WrapUnique(new EventNameFilter(event_filter.filter_args())); | 574 WrapUnique(new EventNameFilter(event_filter.filter_args())); |
| 575 } else if (event_filter.predicate_name() == "heap_profiler_predicate") { |
| 576 new_filter = WrapUnique(new HeapProfilerFilter()); |
545 } else if (event_filter.predicate_name() == "testing_predicate") { | 577 } else if (event_filter.predicate_name() == "testing_predicate") { |
546 CHECK(g_trace_event_filter_constructor_for_testing); | 578 CHECK(g_trace_event_filter_constructor_for_testing); |
547 new_filter = g_trace_event_filter_constructor_for_testing(); | 579 new_filter = g_trace_event_filter_constructor_for_testing(); |
548 } | 580 } |
549 | 581 |
550 if (new_filter) { | 582 if (new_filter) { |
551 g_category_group_filter[category_index].Get().push_back( | 583 g_category_group_filter[category_index].Get().push_back( |
552 std::move(new_filter)); | 584 std::move(new_filter)); |
553 enabled_flag |= ENABLED_FOR_FILTERING; | 585 enabled_flag |= ENABLED_FOR_FILTERING; |
554 } | 586 } |
(...skipping 867 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1422 subtle::NoBarrier_Load(&event_callback_)); | 1454 subtle::NoBarrier_Load(&event_callback_)); |
1423 if (event_callback) { | 1455 if (event_callback) { |
1424 event_callback( | 1456 event_callback( |
1425 offset_event_timestamp, | 1457 offset_event_timestamp, |
1426 phase == TRACE_EVENT_PHASE_COMPLETE ? TRACE_EVENT_PHASE_BEGIN : phase, | 1458 phase == TRACE_EVENT_PHASE_COMPLETE ? TRACE_EVENT_PHASE_BEGIN : phase, |
1427 category_group_enabled, name, scope, id, num_args, arg_names, | 1459 category_group_enabled, name, scope, id, num_args, arg_names, |
1428 arg_types, arg_values, flags); | 1460 arg_types, arg_values, flags); |
1429 } | 1461 } |
1430 } | 1462 } |
1431 | 1463 |
1432 // TODO(primiano): Add support for events with copied name crbug.com/581078 | |
1433 if (!(flags & TRACE_EVENT_FLAG_COPY)) { | |
1434 if (AllocationContextTracker::capture_mode() == | |
1435 AllocationContextTracker::CaptureMode::PSEUDO_STACK) { | |
1436 if (phase == TRACE_EVENT_PHASE_BEGIN || | |
1437 phase == TRACE_EVENT_PHASE_COMPLETE) { | |
1438 AllocationContextTracker::GetInstanceForCurrentThread() | |
1439 ->PushPseudoStackFrame(name); | |
1440 } else if (phase == TRACE_EVENT_PHASE_END) { | |
1441 // The pop for |TRACE_EVENT_PHASE_COMPLETE| events | |
1442 // is in |TraceLog::UpdateTraceEventDuration|. | |
1443 AllocationContextTracker::GetInstanceForCurrentThread() | |
1444 ->PopPseudoStackFrame(name); | |
1445 } | |
1446 } | |
1447 } | |
1448 | |
1449 return handle; | 1464 return handle; |
1450 } | 1465 } |
1451 | 1466 |
1452 void TraceLog::AddMetadataEvent( | 1467 void TraceLog::AddMetadataEvent( |
1453 const unsigned char* category_group_enabled, | 1468 const unsigned char* category_group_enabled, |
1454 const char* name, | 1469 const char* name, |
1455 int num_args, | 1470 int num_args, |
1456 const char** arg_names, | 1471 const char** arg_names, |
1457 const unsigned char* arg_types, | 1472 const unsigned char* arg_types, |
1458 const unsigned long long* arg_values, | 1473 const unsigned long long* arg_values, |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1570 trace_event->UpdateDuration(now, thread_now); | 1585 trace_event->UpdateDuration(now, thread_now); |
1571 #if defined(OS_ANDROID) | 1586 #if defined(OS_ANDROID) |
1572 trace_event->SendToATrace(); | 1587 trace_event->SendToATrace(); |
1573 #endif | 1588 #endif |
1574 } | 1589 } |
1575 | 1590 |
1576 if (trace_options() & kInternalEchoToConsole) { | 1591 if (trace_options() & kInternalEchoToConsole) { |
1577 console_message = | 1592 console_message = |
1578 EventToConsoleMessage(TRACE_EVENT_PHASE_END, now, trace_event); | 1593 EventToConsoleMessage(TRACE_EVENT_PHASE_END, now, trace_event); |
1579 } | 1594 } |
1580 | |
1581 if (AllocationContextTracker::capture_mode() == | |
1582 AllocationContextTracker::CaptureMode::PSEUDO_STACK) { | |
1583 // The corresponding push is in |AddTraceEventWithThreadIdAndTimestamp|. | |
1584 AllocationContextTracker::GetInstanceForCurrentThread() | |
1585 ->PopPseudoStackFrame(name); | |
1586 } | |
1587 } | 1595 } |
1588 | 1596 |
1589 if (!console_message.empty()) | 1597 if (!console_message.empty()) |
1590 LOG(ERROR) << console_message; | 1598 LOG(ERROR) << console_message; |
1591 | 1599 |
1592 if (category_group_enabled_local & ENABLED_FOR_EVENT_CALLBACK) { | 1600 if (category_group_enabled_local & ENABLED_FOR_EVENT_CALLBACK) { |
1593 EventCallback event_callback = reinterpret_cast<EventCallback>( | 1601 EventCallback event_callback = reinterpret_cast<EventCallback>( |
1594 subtle::NoBarrier_Load(&event_callback_)); | 1602 subtle::NoBarrier_Load(&event_callback_)); |
1595 if (event_callback) { | 1603 if (event_callback) { |
1596 event_callback( | 1604 event_callback( |
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1884 } | 1892 } |
1885 | 1893 |
1886 ScopedTraceBinaryEfficient::~ScopedTraceBinaryEfficient() { | 1894 ScopedTraceBinaryEfficient::~ScopedTraceBinaryEfficient() { |
1887 if (*category_group_enabled_) { | 1895 if (*category_group_enabled_) { |
1888 TRACE_EVENT_API_UPDATE_TRACE_EVENT_DURATION(category_group_enabled_, name_, | 1896 TRACE_EVENT_API_UPDATE_TRACE_EVENT_DURATION(category_group_enabled_, name_, |
1889 event_handle_); | 1897 event_handle_); |
1890 } | 1898 } |
1891 } | 1899 } |
1892 | 1900 |
1893 } // namespace trace_event_internal | 1901 } // namespace trace_event_internal |
OLD | NEW |