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