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