blob: e61236bc47cf3335bb585897f1111b62a8202a36 [file] [log] [blame]
/*
* Copyright (C) 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "perfetto/tracing/data_source.h"
#include "perfetto/base/logging.h"
#include "protos/perfetto/config/data_source_config.gen.h"
namespace perfetto {
DataSourceBase::StopArgs::~StopArgs() = default;
DataSourceBase::FlushArgs::~FlushArgs() = default;
DataSourceBase::~DataSourceBase() = default;
void DataSourceBase::OnSetup(const SetupArgs&) {}
void DataSourceBase::OnStart(const StartArgs&) {}
void DataSourceBase::OnStop(const StopArgs&) {}
void DataSourceBase::WillClearIncrementalState(
const ClearIncrementalStateArgs&) {}
void DataSourceBase::OnFlush(const FlushArgs&) {}
bool DataSourceBase::CanAdoptStartupSession(
const DataSourceConfig& startup_config,
const DataSourceConfig& service_config) {
// Clear target buffer and tracing-service provided fields for comparison of
// configs for startup tracing, since these fields are not available when
// setting up data sources for startup tracing.
DataSourceConfig startup_config_stripped = startup_config;
DataSourceConfig service_config_stripped = service_config;
startup_config_stripped.set_target_buffer(0);
startup_config_stripped.set_tracing_session_id(0);
startup_config_stripped.set_session_initiator(
DataSourceConfig::SESSION_INITIATOR_UNSPECIFIED);
startup_config_stripped.set_trace_duration_ms(0);
startup_config_stripped.set_stop_timeout_ms(0);
startup_config_stripped.set_enable_extra_guardrails(false);
service_config_stripped.set_target_buffer(0);
service_config_stripped.set_tracing_session_id(0);
service_config_stripped.set_session_initiator(
DataSourceConfig::SESSION_INITIATOR_UNSPECIFIED);
service_config_stripped.set_trace_duration_ms(0);
service_config_stripped.set_stop_timeout_ms(0);
service_config_stripped.set_enable_extra_guardrails(false);
return startup_config_stripped == service_config_stripped;
}
namespace internal {
void DataSourceType::PopulateTlsInst(
DataSourceInstanceThreadLocalState* tls_inst,
DataSourceState* instance_state,
uint32_t instance_index) {
auto* tracing_impl = TracingMuxer::Get();
tls_inst->muxer_id_for_testing = instance_state->muxer_id_for_testing;
tls_inst->backend_id = instance_state->backend_id;
tls_inst->backend_connection_id = instance_state->backend_connection_id;
tls_inst->buffer_id = instance_state->buffer_id;
tls_inst->startup_target_buffer_reservation =
instance_state->startup_target_buffer_reservation.load(
std::memory_order_relaxed);
tls_inst->data_source_instance_id = instance_state->data_source_instance_id;
tls_inst->is_intercepted = instance_state->interceptor_id != 0;
tls_inst->trace_writer = tracing_impl->CreateTraceWriter(
&state_, instance_index, instance_state, buffer_exhausted_policy_);
if (create_incremental_state_fn_) {
PERFETTO_DCHECK(!tls_inst->incremental_state);
CreateIncrementalState(tls_inst, instance_index);
}
if (create_custom_tls_fn_) {
tls_inst->data_source_custom_tls =
create_custom_tls_fn_(tls_inst, instance_index, user_arg_);
}
// Even in the case of out-of-IDs, SharedMemoryArbiterImpl returns a
// NullTraceWriter. The returned pointer should never be null.
PERFETTO_DCHECK(tls_inst->trace_writer);
}
} // namespace internal
} // namespace perfetto