xref: /aosp_15_r20/external/perfetto/src/tracing/event_context.cc (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
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