| /* | |
| * Copyright (C) 2018 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 "src/trace_processor/types/trace_processor_context.h" | |
| #include <memory> | |
| #include <optional> | |
| #include "src/trace_processor/forwarding_trace_parser.h" | |
| #include "src/trace_processor/importers/common/args_tracker.h" | |
| #include "src/trace_processor/importers/common/args_translation_table.h" | |
| #include "src/trace_processor/importers/common/clock_converter.h" | |
| #include "src/trace_processor/importers/common/clock_tracker.h" | |
| #include "src/trace_processor/importers/common/cpu_tracker.h" | |
| #include "src/trace_processor/importers/common/event_tracker.h" | |
| #include "src/trace_processor/importers/common/flow_tracker.h" | |
| #include "src/trace_processor/importers/common/global_args_tracker.h" | |
| #include "src/trace_processor/importers/common/legacy_v8_cpu_profile_tracker.h" | |
| #include "src/trace_processor/importers/common/machine_tracker.h" | |
| #include "src/trace_processor/importers/common/mapping_tracker.h" | |
| #include "src/trace_processor/importers/common/metadata_tracker.h" | |
| #include "src/trace_processor/importers/common/process_track_translation_table.h" | |
| #include "src/trace_processor/importers/common/process_tracker.h" | |
| #include "src/trace_processor/importers/common/sched_event_tracker.h" | |
| #include "src/trace_processor/importers/common/slice_tracker.h" | |
| #include "src/trace_processor/importers/common/slice_translation_table.h" | |
| #include "src/trace_processor/importers/common/stack_profile_tracker.h" | |
| #include "src/trace_processor/importers/common/trace_file_tracker.h" | |
| #include "src/trace_processor/importers/common/track_compressor.h" | |
| #include "src/trace_processor/importers/common/track_tracker.h" | |
| #include "src/trace_processor/importers/proto/multi_machine_trace_manager.h" | |
| #include "src/trace_processor/importers/proto/perf_sample_tracker.h" | |
| #include "src/trace_processor/importers/proto/proto_importer_module.h" | |
| #include "src/trace_processor/storage/trace_storage.h" | |
| #include "src/trace_processor/trace_reader_registry.h" | |
| namespace perfetto::trace_processor { | |
| TraceProcessorContext::TraceProcessorContext(const InitArgs& args) | |
| : config(args.config), storage(args.storage) { | |
| reader_registry = std::make_unique<TraceReaderRegistry>(this); | |
| // Init the trackers. | |
| machine_tracker = std::make_unique<MachineTracker>(this, args.raw_machine_id); | |
| if (!machine_id()) { | |
| multi_machine_trace_manager = | |
| std::make_unique<MultiMachineTraceManager>(this); | |
| } | |
| track_tracker = std::make_unique<TrackTracker>(this); | |
| track_compressor = std::make_unique<TrackCompressor>(this); | |
| args_tracker = std::make_unique<ArgsTracker>(this); | |
| args_translation_table = | |
| std::make_unique<ArgsTranslationTable>(storage.get()); | |
| slice_tracker = std::make_unique<SliceTracker>(this); | |
| slice_translation_table = | |
| std::make_unique<SliceTranslationTable>(storage.get()); | |
| flow_tracker = std::make_unique<FlowTracker>(this); | |
| event_tracker = std::make_unique<EventTracker>(this); | |
| sched_event_tracker = std::make_unique<SchedEventTracker>(this); | |
| process_tracker = std::make_unique<ProcessTracker>(this); | |
| process_track_translation_table = | |
| std::make_unique<ProcessTrackTranslationTable>(storage.get()); | |
| clock_tracker = std::make_unique<ClockTracker>(this); | |
| clock_converter = std::make_unique<ClockConverter>(this); | |
| mapping_tracker = std::make_unique<MappingTracker>(this); | |
| perf_sample_tracker = std::make_unique<PerfSampleTracker>(this); | |
| stack_profile_tracker = std::make_unique<StackProfileTracker>(this); | |
| metadata_tracker = std::make_unique<MetadataTracker>(storage.get()); | |
| cpu_tracker = std::make_unique<CpuTracker>(this); | |
| global_args_tracker = std::make_shared<GlobalArgsTracker>(storage.get()); | |
| descriptor_pool_ = std::make_unique<DescriptorPool>(); | |
| slice_tracker->SetOnSliceBeginCallback( | |
| [this](TrackId track_id, SliceId slice_id) { | |
| flow_tracker->ClosePendingEventsOnTrack(track_id, slice_id); | |
| }); | |
| trace_file_tracker = std::make_unique<TraceFileTracker>(this); | |
| legacy_v8_cpu_profile_tracker = | |
| std::make_unique<LegacyV8CpuProfileTracker>(this); | |
| } | |
| TraceProcessorContext::TraceProcessorContext() = default; | |
| TraceProcessorContext::~TraceProcessorContext() = default; | |
| TraceProcessorContext::TraceProcessorContext(TraceProcessorContext&&) = default; | |
| TraceProcessorContext& TraceProcessorContext::operator=( | |
| TraceProcessorContext&&) = default; | |
| std::optional<MachineId> TraceProcessorContext::machine_id() const { | |
| if (!machine_tracker) { | |
| // Doesn't require that |machine_tracker| is initialzed, e.g. in unit tests. | |
| return std::nullopt; | |
| } | |
| return machine_tracker->machine_id(); | |
| } | |
| } // namespace perfetto::trace_processor |