xref: /aosp_15_r20/external/perfetto/src/tracing/data_source.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/data_source.h"
18*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/base/logging.h"
19*6dbdd20aSAndroid Build Coastguard Worker #include "protos/perfetto/config/data_source_config.gen.h"
20*6dbdd20aSAndroid Build Coastguard Worker 
21*6dbdd20aSAndroid Build Coastguard Worker namespace perfetto {
22*6dbdd20aSAndroid Build Coastguard Worker 
23*6dbdd20aSAndroid Build Coastguard Worker DataSourceBase::StopArgs::~StopArgs() = default;
24*6dbdd20aSAndroid Build Coastguard Worker DataSourceBase::FlushArgs::~FlushArgs() = default;
25*6dbdd20aSAndroid Build Coastguard Worker DataSourceBase::~DataSourceBase() = default;
OnSetup(const SetupArgs &)26*6dbdd20aSAndroid Build Coastguard Worker void DataSourceBase::OnSetup(const SetupArgs&) {}
OnStart(const StartArgs &)27*6dbdd20aSAndroid Build Coastguard Worker void DataSourceBase::OnStart(const StartArgs&) {}
OnStop(const StopArgs &)28*6dbdd20aSAndroid Build Coastguard Worker void DataSourceBase::OnStop(const StopArgs&) {}
WillClearIncrementalState(const ClearIncrementalStateArgs &)29*6dbdd20aSAndroid Build Coastguard Worker void DataSourceBase::WillClearIncrementalState(
30*6dbdd20aSAndroid Build Coastguard Worker     const ClearIncrementalStateArgs&) {}
OnFlush(const FlushArgs &)31*6dbdd20aSAndroid Build Coastguard Worker void DataSourceBase::OnFlush(const FlushArgs&) {}
32*6dbdd20aSAndroid Build Coastguard Worker 
CanAdoptStartupSession(const DataSourceConfig & startup_config,const DataSourceConfig & service_config)33*6dbdd20aSAndroid Build Coastguard Worker bool DataSourceBase::CanAdoptStartupSession(
34*6dbdd20aSAndroid Build Coastguard Worker     const DataSourceConfig& startup_config,
35*6dbdd20aSAndroid Build Coastguard Worker     const DataSourceConfig& service_config) {
36*6dbdd20aSAndroid Build Coastguard Worker   // Clear target buffer and tracing-service provided fields for comparison of
37*6dbdd20aSAndroid Build Coastguard Worker   // configs for startup tracing, since these fields are not available when
38*6dbdd20aSAndroid Build Coastguard Worker   // setting up data sources for startup tracing.
39*6dbdd20aSAndroid Build Coastguard Worker   DataSourceConfig startup_config_stripped = startup_config;
40*6dbdd20aSAndroid Build Coastguard Worker   DataSourceConfig service_config_stripped = service_config;
41*6dbdd20aSAndroid Build Coastguard Worker 
42*6dbdd20aSAndroid Build Coastguard Worker   startup_config_stripped.set_target_buffer(0);
43*6dbdd20aSAndroid Build Coastguard Worker   startup_config_stripped.set_tracing_session_id(0);
44*6dbdd20aSAndroid Build Coastguard Worker   startup_config_stripped.set_session_initiator(
45*6dbdd20aSAndroid Build Coastguard Worker       DataSourceConfig::SESSION_INITIATOR_UNSPECIFIED);
46*6dbdd20aSAndroid Build Coastguard Worker   startup_config_stripped.set_trace_duration_ms(0);
47*6dbdd20aSAndroid Build Coastguard Worker   startup_config_stripped.set_stop_timeout_ms(0);
48*6dbdd20aSAndroid Build Coastguard Worker   startup_config_stripped.set_enable_extra_guardrails(false);
49*6dbdd20aSAndroid Build Coastguard Worker 
50*6dbdd20aSAndroid Build Coastguard Worker   service_config_stripped.set_target_buffer(0);
51*6dbdd20aSAndroid Build Coastguard Worker   service_config_stripped.set_tracing_session_id(0);
52*6dbdd20aSAndroid Build Coastguard Worker   service_config_stripped.set_session_initiator(
53*6dbdd20aSAndroid Build Coastguard Worker       DataSourceConfig::SESSION_INITIATOR_UNSPECIFIED);
54*6dbdd20aSAndroid Build Coastguard Worker   service_config_stripped.set_trace_duration_ms(0);
55*6dbdd20aSAndroid Build Coastguard Worker   service_config_stripped.set_stop_timeout_ms(0);
56*6dbdd20aSAndroid Build Coastguard Worker   service_config_stripped.set_enable_extra_guardrails(false);
57*6dbdd20aSAndroid Build Coastguard Worker 
58*6dbdd20aSAndroid Build Coastguard Worker   return startup_config_stripped == service_config_stripped;
59*6dbdd20aSAndroid Build Coastguard Worker }
60*6dbdd20aSAndroid Build Coastguard Worker 
61*6dbdd20aSAndroid Build Coastguard Worker namespace internal {
62*6dbdd20aSAndroid Build Coastguard Worker 
PopulateTlsInst(DataSourceInstanceThreadLocalState * tls_inst,DataSourceState * instance_state,uint32_t instance_index)63*6dbdd20aSAndroid Build Coastguard Worker void DataSourceType::PopulateTlsInst(
64*6dbdd20aSAndroid Build Coastguard Worker     DataSourceInstanceThreadLocalState* tls_inst,
65*6dbdd20aSAndroid Build Coastguard Worker     DataSourceState* instance_state,
66*6dbdd20aSAndroid Build Coastguard Worker     uint32_t instance_index) {
67*6dbdd20aSAndroid Build Coastguard Worker   auto* tracing_impl = TracingMuxer::Get();
68*6dbdd20aSAndroid Build Coastguard Worker   tls_inst->muxer_id_for_testing = instance_state->muxer_id_for_testing;
69*6dbdd20aSAndroid Build Coastguard Worker   tls_inst->backend_id = instance_state->backend_id;
70*6dbdd20aSAndroid Build Coastguard Worker   tls_inst->backend_connection_id = instance_state->backend_connection_id;
71*6dbdd20aSAndroid Build Coastguard Worker   tls_inst->buffer_id = instance_state->buffer_id;
72*6dbdd20aSAndroid Build Coastguard Worker   tls_inst->startup_target_buffer_reservation =
73*6dbdd20aSAndroid Build Coastguard Worker       instance_state->startup_target_buffer_reservation.load(
74*6dbdd20aSAndroid Build Coastguard Worker           std::memory_order_relaxed);
75*6dbdd20aSAndroid Build Coastguard Worker   tls_inst->data_source_instance_id = instance_state->data_source_instance_id;
76*6dbdd20aSAndroid Build Coastguard Worker   tls_inst->is_intercepted = instance_state->interceptor_id != 0;
77*6dbdd20aSAndroid Build Coastguard Worker   tls_inst->trace_writer = tracing_impl->CreateTraceWriter(
78*6dbdd20aSAndroid Build Coastguard Worker       &state_, instance_index, instance_state, buffer_exhausted_policy_);
79*6dbdd20aSAndroid Build Coastguard Worker   if (create_incremental_state_fn_) {
80*6dbdd20aSAndroid Build Coastguard Worker     PERFETTO_DCHECK(!tls_inst->incremental_state);
81*6dbdd20aSAndroid Build Coastguard Worker     CreateIncrementalState(tls_inst, instance_index);
82*6dbdd20aSAndroid Build Coastguard Worker   }
83*6dbdd20aSAndroid Build Coastguard Worker   if (create_custom_tls_fn_) {
84*6dbdd20aSAndroid Build Coastguard Worker     tls_inst->data_source_custom_tls =
85*6dbdd20aSAndroid Build Coastguard Worker         create_custom_tls_fn_(tls_inst, instance_index, user_arg_);
86*6dbdd20aSAndroid Build Coastguard Worker   }
87*6dbdd20aSAndroid Build Coastguard Worker   // Even in the case of out-of-IDs, SharedMemoryArbiterImpl returns a
88*6dbdd20aSAndroid Build Coastguard Worker   // NullTraceWriter. The returned pointer should never be null.
89*6dbdd20aSAndroid Build Coastguard Worker   PERFETTO_DCHECK(tls_inst->trace_writer);
90*6dbdd20aSAndroid Build Coastguard Worker }
91*6dbdd20aSAndroid Build Coastguard Worker 
92*6dbdd20aSAndroid Build Coastguard Worker }  // namespace internal
93*6dbdd20aSAndroid Build Coastguard Worker }  // namespace perfetto
94