/* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef INCLUDE_PERFETTO_TRACING_DATA_SOURCE_H_ #define INCLUDE_PERFETTO_TRACING_DATA_SOURCE_H_ // This header contains the key class (DataSource) that a producer app should // override in order to create a custom data source that gets tracing Start/Stop // notifications and emits tracing data. #include <assert.h> #include <stddef.h> #include <stdint.h> #include <array> #include <atomic> #include <functional> #include <memory> #include <mutex> #include "perfetto/protozero/message_handle.h" #include "perfetto/tracing/buffer_exhausted_policy.h" #include "perfetto/tracing/core/flush_flags.h" #include "perfetto/tracing/core/forward_decls.h" #include "perfetto/tracing/internal/basic_types.h" #include "perfetto/tracing/internal/data_source_internal.h" #include "perfetto/tracing/internal/data_source_type.h" #include "perfetto/tracing/internal/tracing_muxer.h" #include "perfetto/tracing/locked_handle.h" #include "perfetto/tracing/trace_writer_base.h" #include "protos/perfetto/trace/trace_packet.pbzero.h" // DEPRECATED: Instead of using this macro, prefer specifying symbol linkage // attributes explicitly using the `_WITH_ATTRS` macro variants (e.g., // PERFETTO_DECLARE_DATA_SOURCE_STATIC_MEMBERS_WITH_ATTRS). This avoids // potential macro definition collisions between two libraries using Perfetto. // // PERFETTO_COMPONENT_EXPORT is used to mark symbols in Perfetto's headers // (typically templates) that are defined by the user outside of Perfetto and // should be made visible outside the current module. (e.g., in Chrome's // component build). #if !defined(PERFETTO_COMPONENT_EXPORT) #if PERFETTO_BUILDFLAG(PERFETTO_COMPILER_MSVC) // Workaround for C4003: not enough arguments for function-like macro invocation // 'PERFETTO_INTERNAL_DECLARE_TRACK_EVENT_DATA_SOURCE' #define PERFETTO_COMPONENT_EXPORT … #else #define PERFETTO_COMPONENT_EXPORT #endif #endif namespace perfetto { namespace internal { class TracingMuxerImpl; class TrackEventCategoryRegistry; template <typename, const internal::TrackEventCategoryRegistry*> class TrackEventDataSource; } // namespace internal namespace shlib { class TrackEvent; } // namespace shlib namespace test { class DataSourceInternalForTest; } // namespace test // Base class with the virtual methods to get start/stop notifications. // Embedders are supposed to derive the templated version below, not this one. class PERFETTO_EXPORT_COMPONENT DataSourceBase { … }; struct DefaultDataSourceTraits { … }; // Holds the type for a DataSource. Accessed by the static Trace() method // fastpaths. This allows redefinitions under a component where a component // specific export macro is used. // Due to C2086 (redefinition) error on MSVC/clang-cl, internal::DataSourceType // can't be a static data member. To avoid explicit specialization after // instantiation error, type() needs to be in a template helper class that's // instantiated independently from DataSource. See b/280777748. template <typename DerivedDataSource, typename DataSourceTraits = DefaultDataSourceTraits> struct DataSourceHelper { … }; // Templated base class meant to be derived by embedders to create a custom data // source. DerivedDataSource must be the type of the derived class itself, e.g.: // class MyDataSource : public DataSource<MyDataSource> {...}. // // |DataSourceTraits| allows customizing the behavior of the data source. See // |DefaultDataSourceTraits|. template <typename DerivedDataSource, typename DataSourceTraits = DefaultDataSourceTraits> class DataSource : public DataSourceBase { … }; // static template <typename T, typename D> thread_local internal::DataSourceThreadLocalState* DataSource<T, D>::tls_state_; } // namespace perfetto // If placed at the end of a macro declaration, eats the semicolon at the end of // the macro invocation (e.g., "MACRO(...);") to avoid warnings about extra // semicolons. #define PERFETTO_INTERNAL_SWALLOW_SEMICOLON() … // This macro must be used once for each data source next to the data source's // declaration. #define PERFETTO_DECLARE_DATA_SOURCE_STATIC_MEMBERS(...) … // Similar to `PERFETTO_DECLARE_DATA_SOURCE_STATIC_MEMBERS` but it also takes // custom attributes, which are useful when DataSource is defined in a component // where a component specific export macro is used. #define PERFETTO_DECLARE_DATA_SOURCE_STATIC_MEMBERS_WITH_ATTRS(attrs, ...) … // This macro must be used once for each data source in one source file to // allocate static storage for the data source's static state. #define PERFETTO_DEFINE_DATA_SOURCE_STATIC_MEMBERS(...) … // Similar to `PERFETTO_DEFINE_DATA_SOURCE_STATIC_MEMBERS` but it also takes // custom attributes, which are useful when DataSource is defined in a component // where a component specific export macro is used. #define PERFETTO_DEFINE_DATA_SOURCE_STATIC_MEMBERS_WITH_ATTRS(attrs, ...) … #endif // INCLUDE_PERFETTO_TRACING_DATA_SOURCE_H_