xref: /aosp_15_r20/external/perfetto/src/trace_processor/importers/proto/multi_machine_trace_manager.cc (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
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)44 MultiMachineTraceManager::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)51 std::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)66 void MultiMachineTraceManager::EnableAdditionalModules(
67     ProtoImporterModuleFactory factory) {
68   additional_modules_factory_ = factory;
69 }
70 
GetOrCreateReader(RawMachineId raw_machine_id)71 ProtoTraceReader* 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