xref: /aosp_15_r20/external/perfetto/src/tracing/data_source.cc (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1 /*
2  * Copyright (C) 2019 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include "perfetto/tracing/data_source.h"
18 #include "perfetto/base/logging.h"
19 #include "protos/perfetto/config/data_source_config.gen.h"
20 
21 namespace perfetto {
22 
23 DataSourceBase::StopArgs::~StopArgs() = default;
24 DataSourceBase::FlushArgs::~FlushArgs() = default;
25 DataSourceBase::~DataSourceBase() = default;
OnSetup(const SetupArgs &)26 void DataSourceBase::OnSetup(const SetupArgs&) {}
OnStart(const StartArgs &)27 void DataSourceBase::OnStart(const StartArgs&) {}
OnStop(const StopArgs &)28 void DataSourceBase::OnStop(const StopArgs&) {}
WillClearIncrementalState(const ClearIncrementalStateArgs &)29 void DataSourceBase::WillClearIncrementalState(
30     const ClearIncrementalStateArgs&) {}
OnFlush(const FlushArgs &)31 void DataSourceBase::OnFlush(const FlushArgs&) {}
32 
CanAdoptStartupSession(const DataSourceConfig & startup_config,const DataSourceConfig & service_config)33 bool DataSourceBase::CanAdoptStartupSession(
34     const DataSourceConfig& startup_config,
35     const DataSourceConfig& service_config) {
36   // Clear target buffer and tracing-service provided fields for comparison of
37   // configs for startup tracing, since these fields are not available when
38   // setting up data sources for startup tracing.
39   DataSourceConfig startup_config_stripped = startup_config;
40   DataSourceConfig service_config_stripped = service_config;
41 
42   startup_config_stripped.set_target_buffer(0);
43   startup_config_stripped.set_tracing_session_id(0);
44   startup_config_stripped.set_session_initiator(
45       DataSourceConfig::SESSION_INITIATOR_UNSPECIFIED);
46   startup_config_stripped.set_trace_duration_ms(0);
47   startup_config_stripped.set_stop_timeout_ms(0);
48   startup_config_stripped.set_enable_extra_guardrails(false);
49 
50   service_config_stripped.set_target_buffer(0);
51   service_config_stripped.set_tracing_session_id(0);
52   service_config_stripped.set_session_initiator(
53       DataSourceConfig::SESSION_INITIATOR_UNSPECIFIED);
54   service_config_stripped.set_trace_duration_ms(0);
55   service_config_stripped.set_stop_timeout_ms(0);
56   service_config_stripped.set_enable_extra_guardrails(false);
57 
58   return startup_config_stripped == service_config_stripped;
59 }
60 
61 namespace internal {
62 
PopulateTlsInst(DataSourceInstanceThreadLocalState * tls_inst,DataSourceState * instance_state,uint32_t instance_index)63 void DataSourceType::PopulateTlsInst(
64     DataSourceInstanceThreadLocalState* tls_inst,
65     DataSourceState* instance_state,
66     uint32_t instance_index) {
67   auto* tracing_impl = TracingMuxer::Get();
68   tls_inst->muxer_id_for_testing = instance_state->muxer_id_for_testing;
69   tls_inst->backend_id = instance_state->backend_id;
70   tls_inst->backend_connection_id = instance_state->backend_connection_id;
71   tls_inst->buffer_id = instance_state->buffer_id;
72   tls_inst->startup_target_buffer_reservation =
73       instance_state->startup_target_buffer_reservation.load(
74           std::memory_order_relaxed);
75   tls_inst->data_source_instance_id = instance_state->data_source_instance_id;
76   tls_inst->is_intercepted = instance_state->interceptor_id != 0;
77   tls_inst->trace_writer = tracing_impl->CreateTraceWriter(
78       &state_, instance_index, instance_state, buffer_exhausted_policy_);
79   if (create_incremental_state_fn_) {
80     PERFETTO_DCHECK(!tls_inst->incremental_state);
81     CreateIncrementalState(tls_inst, instance_index);
82   }
83   if (create_custom_tls_fn_) {
84     tls_inst->data_source_custom_tls =
85         create_custom_tls_fn_(tls_inst, instance_index, user_arg_);
86   }
87   // Even in the case of out-of-IDs, SharedMemoryArbiterImpl returns a
88   // NullTraceWriter. The returned pointer should never be null.
89   PERFETTO_DCHECK(tls_inst->trace_writer);
90 }
91 
92 }  // namespace internal
93 }  // namespace perfetto
94