blob: e61236bc47cf3335bb585897f1111b62a8202a36 [file] [log] [blame]
Primiano Tuccib5798842019-05-21 23:54:03 +01001/*
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
Primiano Tucci2c5488f2019-06-01 03:27:28 +010017#include "perfetto/tracing/data_source.h"
Daniele Di Proietto1cb3efc2022-05-06 19:45:52 +010018#include "perfetto/base/logging.h"
Mikhail Khokhlov5f966ae2023-06-06 17:11:13 +010019#include "protos/perfetto/config/data_source_config.gen.h"
Primiano Tuccib5798842019-05-21 23:54:03 +010020
21namespace perfetto {
22
Primiano Tuccidd5ebc92019-07-25 01:09:37 +010023DataSourceBase::StopArgs::~StopArgs() = default;
Daniele Di Proietto305a23f2023-03-15 13:37:29 +000024DataSourceBase::FlushArgs::~FlushArgs() = default;
Primiano Tuccib5798842019-05-21 23:54:03 +010025DataSourceBase::~DataSourceBase() = default;
26void DataSourceBase::OnSetup(const SetupArgs&) {}
27void DataSourceBase::OnStart(const StartArgs&) {}
28void DataSourceBase::OnStop(const StopArgs&) {}
Mikhail Khokhlov26aaf6f2022-06-29 15:19:31 +010029void DataSourceBase::WillClearIncrementalState(
30 const ClearIncrementalStateArgs&) {}
Daniele Di Proietto305a23f2023-03-15 13:37:29 +000031void DataSourceBase::OnFlush(const FlushArgs&) {}
Primiano Tuccib5798842019-05-21 23:54:03 +010032
Mikhail Khokhlov5f966ae2023-06-06 17:11:13 +010033bool 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
Daniele Di Proietto1cb3efc2022-05-06 19:45:52 +010061namespace internal {
62
63void 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
Primiano Tuccib5798842019-05-21 23:54:03 +010093} // namespace perfetto