#include "perfetto/public/abi/track_event_abi.h"
#include "perfetto/public/abi/track_event_hl_abi.h"
#include "perfetto/public/abi/track_event_ll_abi.h"
#include <algorithm>
#include <atomic>
#include <limits>
#include <mutex>
#include <optional>
#include "perfetto/base/compiler.h"
#include "perfetto/base/flat_set.h"
#include "perfetto/ext/base/file_utils.h"
#include "perfetto/ext/base/no_destructor.h"
#include "perfetto/ext/base/string_splitter.h"
#include "perfetto/ext/base/string_view.h"
#include "perfetto/ext/base/thread_utils.h"
#include "perfetto/protozero/contiguous_memory_range.h"
#include "perfetto/public/compiler.h"
#include "perfetto/tracing/data_source.h"
#include "perfetto/tracing/internal/basic_types.h"
#include "perfetto/tracing/internal/data_source_internal.h"
#include "perfetto/tracing/internal/track_event_internal.h"
#include "perfetto/tracing/track.h"
#include "protos/perfetto/common/data_source_descriptor.gen.h"
#include "protos/perfetto/common/track_event_descriptor.pbzero.h"
#include "protos/perfetto/config/data_source_config.gen.h"
#include "protos/perfetto/config/track_event/track_event_config.gen.h"
#include "protos/perfetto/trace/clock_snapshot.pbzero.h"
#include "protos/perfetto/trace/interned_data/interned_data.pbzero.h"
#include "protos/perfetto/trace/trace_packet.pbzero.h"
#include "protos/perfetto/trace/trace_packet_defaults.pbzero.h"
#include "protos/perfetto/trace/track_event/debug_annotation.pbzero.h"
#include "protos/perfetto/trace/track_event/process_descriptor.pbzero.h"
#include "protos/perfetto/trace/track_event/thread_descriptor.pbzero.h"
#include "protos/perfetto/trace/track_event/track_event.pbzero.h"
#include "src/shared_lib/intern_map.h"
#include "src/shared_lib/reset_for_testing.h"
struct PerfettoTeCategoryImpl* perfetto_te_any_categories;
PERFETTO_ATOMIC(bool) * perfetto_te_any_categories_enabled;
uint64_t perfetto_te_process_track_uuid;
struct PerfettoTeCategoryImpl { … };
enum class MatchType { … };
static bool NameMatchesPattern(const std::string& pattern,
const perfetto::base::StringView& name,
MatchType match_type) { … }
static bool NameMatchesPatternList(const std::vector<std::string>& patterns,
const perfetto::base::StringView& name,
MatchType match_type) { … }
static bool IsSingleCategoryEnabled(
const PerfettoTeCategoryDescriptor& c,
const perfetto::protos::gen::TrackEventConfig& config) { … }
static bool IsRegisteredCategoryEnabled(
const PerfettoTeCategoryImpl& cat,
const perfetto::protos::gen::TrackEventConfig& config) { … }
static void EnableRegisteredCategory(PerfettoTeCategoryImpl* cat,
uint32_t instance_index) { … }
static void DisableRegisteredCategory(PerfettoTeCategoryImpl* cat,
uint32_t instance_index) { … }
static void SerializeCategory(
const PerfettoTeCategoryDescriptor& desc,
perfetto::protos::pbzero::TrackEventDescriptor* ted) { … }
namespace perfetto {
namespace shlib {
struct TrackEventIncrementalState { … };
struct TrackEventTlsState { … };
struct TrackEventDataSourceTraits : public perfetto::DefaultDataSourceTraits { … };
class TrackEvent
: public perfetto::DataSource<TrackEvent, TrackEventDataSourceTraits> { … };
TrackEvent::~TrackEvent() = default;
void ResetTrackEventTls() { … }
struct TracePointTraits { … };
}
}
PERFETTO_DECLARE_DATA_SOURCE_STATIC_MEMBERS(
perfetto::shlib::TrackEvent,
perfetto::shlib::TrackEventDataSourceTraits);
PERFETTO_DEFINE_DATA_SOURCE_STATIC_MEMBERS(
perfetto::shlib::TrackEvent,
perfetto::shlib::TrackEventDataSourceTraits);
perfetto::internal::DataSourceType* perfetto::shlib::TrackEvent::GetType() { … }
perfetto::internal::DataSourceThreadLocalState**
perfetto::shlib::TrackEvent::GetTlsState() { … }
namespace {
TrackEventInternal;
perfetto::protos::pbzero::TrackEvent::Type EventType(int32_t type) { … }
protozero::MessageHandle<perfetto::protos::pbzero::TracePacket>
NewTracePacketInternal(perfetto::TraceWriterBase* trace_writer,
perfetto::shlib::TrackEventIncrementalState* incr_state,
const perfetto::shlib::TrackEventTlsState& tls_state,
perfetto::TraceTimestamp timestamp,
uint32_t seq_flags) { … }
#if PERFETTO_BUILDFLAG(PERFETTO_OS_LINUX) || \
PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID)
std::vector<std::string> GetCmdLine() { … }
#endif
void ResetIncrementalStateIfRequired(
perfetto::TraceWriterBase* trace_writer,
perfetto::shlib::TrackEventIncrementalState* incr_state,
const perfetto::shlib::TrackEventTlsState& tls_state,
const perfetto::TraceTimestamp& timestamp) { … }
void AppendHlProtoFields(protozero::Message* msg,
PerfettoTeHlProtoField* const* fields) { … }
void WriteTrackEvent(perfetto::shlib::TrackEventIncrementalState* incr,
perfetto::protos::pbzero::TrackEvent* event,
PerfettoTeCategoryImpl* cat,
perfetto::protos::pbzero::TrackEvent::Type type,
const char* name,
const PerfettoTeHlExtra* const* extra_data,
std::optional<uint64_t> track_uuid,
const PerfettoTeCategoryDescriptor* dynamic_cat,
bool use_interning) { … }
}
struct PerfettoTeCategoryImpl* PerfettoTeCategoryImplCreate(
struct PerfettoTeCategoryDescriptor* desc) { … }
void PerfettoTePublishCategories() { … }
void PerfettoTeCategoryImplSetCallback(struct PerfettoTeCategoryImpl* cat,
PerfettoTeCategoryImplCallback cb,
void* user_arg) { … }
PERFETTO_ATOMIC(bool) *
PerfettoTeCategoryImplGetEnabled(struct PerfettoTeCategoryImpl* cat) { … }
uint64_t PerfettoTeCategoryImplGetIid(struct PerfettoTeCategoryImpl* cat) { … }
void PerfettoTeCategoryImplDestroy(struct PerfettoTeCategoryImpl* cat) { … }
void PerfettoTeInit(void) { … }
struct PerfettoTeTimestamp PerfettoTeGetTimestamp(void) { … }
static bool IsDynamicCategoryEnabled(
uint32_t inst_idx,
perfetto::shlib::TrackEventIncrementalState* incr_state,
const struct PerfettoTeCategoryDescriptor& desc) { … }
static void AdvanceToFirstEnabledDynamicCategory(
perfetto::internal::DataSourceType::InstancesIterator* ii,
perfetto::internal::DataSourceThreadLocalState* tls_state,
struct PerfettoTeCategoryImpl* cat,
const PerfettoTeCategoryDescriptor& dyn_cat) { … }
static void InstanceOp(
perfetto::internal::DataSourceType* ds,
perfetto::internal::DataSourceType::InstancesIterator* ii,
perfetto::internal::DataSourceThreadLocalState* tls_state,
struct PerfettoTeCategoryImpl* cat,
perfetto::protos::pbzero::TrackEvent::Type type,
const char* name,
struct PerfettoTeHlExtra* const* extra_data) { … }
void PerfettoTeHlEmitImpl(struct PerfettoTeCategoryImpl* cat,
int32_t type,
const char* name,
struct PerfettoTeHlExtra* const* extra_data) { … }
static void FillIterator(
const perfetto::internal::DataSourceType::InstancesIterator* ii,
struct PerfettoTeTimestamp ts,
struct PerfettoTeLlImplIterator* iterator) { … }
struct PerfettoTeLlImplIterator PerfettoTeLlImplBegin(
struct PerfettoTeCategoryImpl* cat,
struct PerfettoTeTimestamp ts) { … }
void PerfettoTeLlImplNext(struct PerfettoTeCategoryImpl* cat,
struct PerfettoTeTimestamp ts,
struct PerfettoTeLlImplIterator* iterator) { … }
void PerfettoTeLlImplBreak(struct PerfettoTeCategoryImpl*,
struct PerfettoTeLlImplIterator* iterator) { … }
bool PerfettoTeLlImplDynCatEnabled(
struct PerfettoDsTracerImpl* tracer,
PerfettoDsInstanceIndex inst_id,
const struct PerfettoTeCategoryDescriptor* dyn_cat) { … }
bool PerfettoTeLlImplTrackSeen(struct PerfettoTeLlImplIncr* incr,
uint64_t uuid) { … }
uint64_t PerfettoTeLlImplIntern(struct PerfettoTeLlImplIncr* incr,
int32_t type,
const void* data,
size_t data_size,
bool* seen) { … }