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

Unified Diff: base/trace_event/event_filter_registry.cc

Issue 2499583003: [OBSOLETE] tracing: split trace event filter logic out of TraceLog (Closed)
Patch Set: . Created 4 years, 1 month 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 side-by-side diff with in-line comments
Download patch
Index: base/trace_event/event_filter_registry.cc
diff --git a/base/trace_event/event_filter_registry.cc b/base/trace_event/event_filter_registry.cc
new file mode 100644
index 0000000000000000000000000000000000000000..2c2fe8ceee2bad8a6b155c8dd756c8be85d098f2
--- /dev/null
+++ b/base/trace_event/event_filter_registry.cc
@@ -0,0 +1,70 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/trace_event/event_filter_registry.h"
+
+#include <string.h>
+
+#include "base/atomicops.h"
+#include "base/logging.h"
+#include "base/trace_event/trace_event_filter.h"
+
+namespace base {
+namespace trace_event {
+
+namespace {
+
+constexpr size_t kMaxFilters = 32;
+TraceEventFilter* g_filters[kMaxFilters] = {nullptr};
+base::subtle::AtomicWord g_filters_index = 0;
+
+} // namespace
+
+// static
+TraceEventFilter* EventFilterRegistry::RegisterFilterInternal(
+ const char* name,
+ FilterFactoryFn filter_factory_fn) {
+ // By contract this function is serialized (i.e. locked) by the caller.
+ TraceEventFilter* filter = GetByName(name);
+ if (filter)
+ return filter;
+ const size_t filter_index = base::subtle::NoBarrier_Load(&g_filters_index);
+ CHECK_LE(filter_index, kMaxFilters);
+
+ // Filters are undefinitely lived, once registered they are leaked forever.
+ filter = filter_factory_fn().release();
+ g_filters[filter_index] = filter;
+ base::subtle::Release_Store(&g_filters_index, filter_index + 1);
+ return filter;
+}
+
+// static
+TraceEventFilter* EventFilterRegistry::Get(int filter_index) {
+ CHECK(filter_index >= 0 &&
+ filter_index < base::subtle::NoBarrier_Load(&g_filters_index));
+ return g_filters[filter_index];
+}
+
+// static
+TraceEventFilter* EventFilterRegistry::GetByName(const char* filter_name) {
+ const int index = GetIndexByName(filter_name);
+ if (index == -1)
+ return nullptr;
+ return g_filters[index];
+}
+
+int EventFilterRegistry::GetIndexByName(const char* filter_name) {
+ // g_filters is append-only, acquire semantics guarantee that the filter has
+ // been initialized once the array entry has been populated.
+ const size_t filter_index = base::subtle::Acquire_Load(&g_filters_index);
+ for (int i = 0; i < static_cast<int>(filter_index); ++i) {
+ TraceEventFilter* const filter = g_filters[i];
+ if (filter && strcmp(filter->name(), filter_name) == 0)
+ return i;
+ }
+ return -1;
+}
+
+} // namespace trace_event
+} // namespace base

Powered by Google App Engine
This is Rietveld 408576698