1*6dbdd20aSAndroid Build Coastguard Worker /*
2*6dbdd20aSAndroid Build Coastguard Worker * Copyright (C) 2019 The Android Open Source Project
3*6dbdd20aSAndroid Build Coastguard Worker *
4*6dbdd20aSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*6dbdd20aSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*6dbdd20aSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*6dbdd20aSAndroid Build Coastguard Worker *
8*6dbdd20aSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*6dbdd20aSAndroid Build Coastguard Worker *
10*6dbdd20aSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*6dbdd20aSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*6dbdd20aSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*6dbdd20aSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*6dbdd20aSAndroid Build Coastguard Worker * limitations under the License.
15*6dbdd20aSAndroid Build Coastguard Worker */
16*6dbdd20aSAndroid Build Coastguard Worker
17*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/tracing/event_context.h"
18*6dbdd20aSAndroid Build Coastguard Worker
19*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/tracing/internal/track_event_interned_fields.h"
20*6dbdd20aSAndroid Build Coastguard Worker #include "protos/perfetto/trace/interned_data/interned_data.pbzero.h"
21*6dbdd20aSAndroid Build Coastguard Worker #include "protos/perfetto/trace/track_event/track_event.pbzero.h"
22*6dbdd20aSAndroid Build Coastguard Worker
23*6dbdd20aSAndroid Build Coastguard Worker namespace perfetto {
24*6dbdd20aSAndroid Build Coastguard Worker
EventContext(TraceWriterBase * trace_writer,EventContext::TracePacketHandle trace_packet,internal::TrackEventIncrementalState * incremental_state,internal::TrackEventTlsState * tls_state)25*6dbdd20aSAndroid Build Coastguard Worker EventContext::EventContext(
26*6dbdd20aSAndroid Build Coastguard Worker TraceWriterBase* trace_writer,
27*6dbdd20aSAndroid Build Coastguard Worker EventContext::TracePacketHandle trace_packet,
28*6dbdd20aSAndroid Build Coastguard Worker internal::TrackEventIncrementalState* incremental_state,
29*6dbdd20aSAndroid Build Coastguard Worker internal::TrackEventTlsState* tls_state)
30*6dbdd20aSAndroid Build Coastguard Worker : trace_writer_(trace_writer),
31*6dbdd20aSAndroid Build Coastguard Worker trace_packet_(std::move(trace_packet)),
32*6dbdd20aSAndroid Build Coastguard Worker event_(trace_packet_->set_track_event()),
33*6dbdd20aSAndroid Build Coastguard Worker incremental_state_(incremental_state),
34*6dbdd20aSAndroid Build Coastguard Worker tls_state_(tls_state) {}
35*6dbdd20aSAndroid Build Coastguard Worker
~EventContext()36*6dbdd20aSAndroid Build Coastguard Worker EventContext::~EventContext() {
37*6dbdd20aSAndroid Build Coastguard Worker if (!trace_packet_)
38*6dbdd20aSAndroid Build Coastguard Worker return;
39*6dbdd20aSAndroid Build Coastguard Worker
40*6dbdd20aSAndroid Build Coastguard Worker // When the track event is finalized (i.e., the context is destroyed), we
41*6dbdd20aSAndroid Build Coastguard Worker // should flush any newly seen interned data to the trace. The data has
42*6dbdd20aSAndroid Build Coastguard Worker // earlier been written to a heap allocated protobuf message
43*6dbdd20aSAndroid Build Coastguard Worker // (|serialized_interned_data|). Here we just need to flush it to the main
44*6dbdd20aSAndroid Build Coastguard Worker // trace.
45*6dbdd20aSAndroid Build Coastguard Worker auto& serialized_interned_data = incremental_state_->serialized_interned_data;
46*6dbdd20aSAndroid Build Coastguard Worker if (PERFETTO_UNLIKELY(!serialized_interned_data.empty())) {
47*6dbdd20aSAndroid Build Coastguard Worker auto ranges = serialized_interned_data.GetRanges();
48*6dbdd20aSAndroid Build Coastguard Worker trace_packet_->AppendScatteredBytes(
49*6dbdd20aSAndroid Build Coastguard Worker perfetto::protos::pbzero::TracePacket::kInternedDataFieldNumber,
50*6dbdd20aSAndroid Build Coastguard Worker &ranges[0], ranges.size());
51*6dbdd20aSAndroid Build Coastguard Worker
52*6dbdd20aSAndroid Build Coastguard Worker // Reset the message but keep one buffer allocated for future use.
53*6dbdd20aSAndroid Build Coastguard Worker serialized_interned_data.Reset();
54*6dbdd20aSAndroid Build Coastguard Worker }
55*6dbdd20aSAndroid Build Coastguard Worker }
56*6dbdd20aSAndroid Build Coastguard Worker
AddDebugAnnotation(const char * name)57*6dbdd20aSAndroid Build Coastguard Worker protos::pbzero::DebugAnnotation* EventContext::AddDebugAnnotation(
58*6dbdd20aSAndroid Build Coastguard Worker const char* name) {
59*6dbdd20aSAndroid Build Coastguard Worker auto annotation = event()->add_debug_annotations();
60*6dbdd20aSAndroid Build Coastguard Worker annotation->set_name_iid(
61*6dbdd20aSAndroid Build Coastguard Worker internal::InternedDebugAnnotationName::Get(this, name));
62*6dbdd20aSAndroid Build Coastguard Worker return annotation;
63*6dbdd20aSAndroid Build Coastguard Worker }
64*6dbdd20aSAndroid Build Coastguard Worker
AddDebugAnnotation(::perfetto::DynamicString name)65*6dbdd20aSAndroid Build Coastguard Worker protos::pbzero::DebugAnnotation* EventContext::AddDebugAnnotation(
66*6dbdd20aSAndroid Build Coastguard Worker ::perfetto::DynamicString name) {
67*6dbdd20aSAndroid Build Coastguard Worker auto annotation = event()->add_debug_annotations();
68*6dbdd20aSAndroid Build Coastguard Worker annotation->set_name(name.value);
69*6dbdd20aSAndroid Build Coastguard Worker return annotation;
70*6dbdd20aSAndroid Build Coastguard Worker }
71*6dbdd20aSAndroid Build Coastguard Worker
GetTlsUserData(const void * key)72*6dbdd20aSAndroid Build Coastguard Worker TrackEventTlsStateUserData* EventContext::GetTlsUserData(const void* key) {
73*6dbdd20aSAndroid Build Coastguard Worker PERFETTO_CHECK(tls_state_);
74*6dbdd20aSAndroid Build Coastguard Worker PERFETTO_CHECK(key);
75*6dbdd20aSAndroid Build Coastguard Worker auto it = tls_state_->user_data.find(key);
76*6dbdd20aSAndroid Build Coastguard Worker if (it != tls_state_->user_data.end()) {
77*6dbdd20aSAndroid Build Coastguard Worker return it->second.get();
78*6dbdd20aSAndroid Build Coastguard Worker }
79*6dbdd20aSAndroid Build Coastguard Worker return nullptr;
80*6dbdd20aSAndroid Build Coastguard Worker }
81*6dbdd20aSAndroid Build Coastguard Worker
SetTlsUserData(const void * key,std::unique_ptr<TrackEventTlsStateUserData> data)82*6dbdd20aSAndroid Build Coastguard Worker void EventContext::SetTlsUserData(
83*6dbdd20aSAndroid Build Coastguard Worker const void* key,
84*6dbdd20aSAndroid Build Coastguard Worker std::unique_ptr<TrackEventTlsStateUserData> data) {
85*6dbdd20aSAndroid Build Coastguard Worker PERFETTO_CHECK(tls_state_);
86*6dbdd20aSAndroid Build Coastguard Worker PERFETTO_CHECK(key);
87*6dbdd20aSAndroid Build Coastguard Worker tls_state_->user_data[key] = std::move(data);
88*6dbdd20aSAndroid Build Coastguard Worker }
89*6dbdd20aSAndroid Build Coastguard Worker
90*6dbdd20aSAndroid Build Coastguard Worker } // namespace perfetto
91