1 /* 2 * Copyright (C) 2024 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 "src/trace_processor/importers/proto/multi_machine_trace_manager.h" 18 #include <memory> 19 20 #include "src/trace_processor/importers/common/args_translation_table.h" 21 #include "src/trace_processor/importers/common/async_track_set_tracker.h" 22 #include "src/trace_processor/importers/common/clock_converter.h" 23 #include "src/trace_processor/importers/common/clock_tracker.h" 24 #include "src/trace_processor/importers/common/event_tracker.h" 25 #include "src/trace_processor/importers/common/flow_tracker.h" 26 #include "src/trace_processor/importers/common/machine_tracker.h" 27 #include "src/trace_processor/importers/common/mapping_tracker.h" 28 #include "src/trace_processor/importers/common/process_tracker.h" 29 #include "src/trace_processor/importers/common/sched_event_tracker.h" 30 #include "src/trace_processor/importers/common/slice_tracker.h" 31 #include "src/trace_processor/importers/common/stack_profile_tracker.h" 32 #include "src/trace_processor/importers/common/track_tracker.h" 33 #include "src/trace_processor/importers/proto/default_modules.h" 34 #include "src/trace_processor/importers/proto/perf_sample_tracker.h" 35 #include "src/trace_processor/importers/proto/proto_importer_module.h" 36 #include "src/trace_processor/importers/proto/proto_trace_parser_impl.h" 37 #include "src/trace_processor/importers/proto/proto_trace_reader.h" 38 #include "src/trace_processor/sorter/trace_sorter.h" 39 #include "src/trace_processor/types/trace_processor_context.h" 40 41 namespace perfetto { 42 namespace trace_processor { 43 MultiMachineTraceManager(TraceProcessorContext * default_context)44MultiMachineTraceManager::MultiMachineTraceManager( 45 TraceProcessorContext* default_context) 46 : default_context_(default_context) { 47 PERFETTO_DCHECK(default_context && !default_context_->machine_id()); 48 } 49 MultiMachineTraceManager::~MultiMachineTraceManager() = default; 50 CreateContext(RawMachineId raw_machine_id)51std::unique_ptr<TraceProcessorContext> MultiMachineTraceManager::CreateContext( 52 RawMachineId raw_machine_id) { 53 TraceProcessorContext::InitArgs args{ 54 default_context_->config, default_context_->storage, raw_machine_id}; 55 auto ctx = std::make_unique<TraceProcessorContext>(args); 56 57 // Register default and additional modules (if enabled). 58 RegisterDefaultModules(ctx.get()); 59 // Register addtional modules through the registered function pointer. 60 if (additional_modules_factory_) 61 additional_modules_factory_(ctx.get()); 62 63 return ctx; 64 } 65 EnableAdditionalModules(ProtoImporterModuleFactory factory)66void MultiMachineTraceManager::EnableAdditionalModules( 67 ProtoImporterModuleFactory factory) { 68 additional_modules_factory_ = factory; 69 } 70 GetOrCreateReader(RawMachineId raw_machine_id)71ProtoTraceReader* MultiMachineTraceManager::GetOrCreateReader( 72 RawMachineId raw_machine_id) { 73 auto* remote_ctx = remote_machine_contexts_.Find(raw_machine_id); 74 if (remote_ctx) 75 return remote_ctx->reader.get(); 76 77 auto context = CreateContext(raw_machine_id); 78 // Share the sorter, but enable for the parser. 79 context->sorter = default_context_->sorter; 80 context->sorter->AddMachineContext(context.get()); 81 context->process_tracker->SetPidZeroIsUpidZeroIdleProcess(); 82 context->proto_trace_parser.reset(new ProtoTraceParserImpl(context.get())); 83 84 auto new_reader = std::make_unique<ProtoTraceReader>(context.get()); 85 remote_machine_contexts_[raw_machine_id] = 86 RemoteMachineContext{std::move(context), std::move(new_reader)}; 87 return remote_machine_contexts_[raw_machine_id].reader.get(); 88 } 89 90 } // namespace trace_processor 91 } // namespace perfetto 92