Primiano Tucci | b579884 | 2019-05-21 23:54:03 +0100 | [diff] [blame] | 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 | |
Primiano Tucci | 2c5488f | 2019-06-01 03:27:28 +0100 | [diff] [blame] | 17 | #include "perfetto/tracing/data_source.h" |
Daniele Di Proietto | 1cb3efc | 2022-05-06 19:45:52 +0100 | [diff] [blame] | 18 | #include "perfetto/base/logging.h" |
Mikhail Khokhlov | 5f966ae | 2023-06-06 17:11:13 +0100 | [diff] [blame] | 19 | #include "protos/perfetto/config/data_source_config.gen.h" |
Primiano Tucci | b579884 | 2019-05-21 23:54:03 +0100 | [diff] [blame] | 20 | |
| 21 | namespace perfetto { |
| 22 | |
Primiano Tucci | dd5ebc9 | 2019-07-25 01:09:37 +0100 | [diff] [blame] | 23 | DataSourceBase::StopArgs::~StopArgs() = default; |
Daniele Di Proietto | 305a23f | 2023-03-15 13:37:29 +0000 | [diff] [blame] | 24 | DataSourceBase::FlushArgs::~FlushArgs() = default; |
Primiano Tucci | b579884 | 2019-05-21 23:54:03 +0100 | [diff] [blame] | 25 | DataSourceBase::~DataSourceBase() = default; |
| 26 | void DataSourceBase::OnSetup(const SetupArgs&) {} |
| 27 | void DataSourceBase::OnStart(const StartArgs&) {} |
| 28 | void DataSourceBase::OnStop(const StopArgs&) {} |
Mikhail Khokhlov | 26aaf6f | 2022-06-29 15:19:31 +0100 | [diff] [blame] | 29 | void DataSourceBase::WillClearIncrementalState( |
| 30 | const ClearIncrementalStateArgs&) {} |
Daniele Di Proietto | 305a23f | 2023-03-15 13:37:29 +0000 | [diff] [blame] | 31 | void DataSourceBase::OnFlush(const FlushArgs&) {} |
Primiano Tucci | b579884 | 2019-05-21 23:54:03 +0100 | [diff] [blame] | 32 | |
Mikhail Khokhlov | 5f966ae | 2023-06-06 17:11:13 +0100 | [diff] [blame] | 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 | |
Daniele Di Proietto | 1cb3efc | 2022-05-06 19:45:52 +0100 | [diff] [blame] | 61 | namespace internal { |
| 62 | |
| 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 |
Primiano Tucci | b579884 | 2019-05-21 23:54:03 +0100 | [diff] [blame] | 93 | } // namespace perfetto |