// Copyright Epic Games, Inc. All Rights Reserved. #include "TraceServices/ITraceServicesModule.h" #include "AnalysisServicePrivate.h" #include "Features/IModularFeatures.h" #include "HAL/LowLevelMemTracker.h" #include "ModuleServicePrivate.h" #include "Modules/CookProfilerModule.h" #include "Modules/CountersModule.h" #include "Modules/CsvProfilerModule.h" #include "Modules/DiagnosticsModule.h" #include "Modules/LoadTimeProfilerModule.h" #include "Modules/MemoryModule.h" #include "Modules/ModuleManager.h" #include "Modules/NetProfilerModule.h" #include "Modules/PlatformEventsModule.h" #include "Modules/StatsModule.h" #include "Modules/TasksModule.h" #include "Modules/TimingProfilerModule.h" #include "Stats/StatsTrace.h" LLM_DEFINE_TAG(Insights_TraceServices, NAME_None, TEXT("Insights")); class FTraceServicesModule : public ITraceServicesModule { public: virtual TSharedPtr GetAnalysisService() override; virtual TSharedPtr GetModuleService() override; virtual TSharedPtr CreateAnalysisService() override; virtual TSharedPtr CreateModuleService() override; virtual void StartupModule() override; virtual void ShutdownModule() override; private: TSharedPtr AnalysisService; TSharedPtr ModuleService; TraceServices::FTimingProfilerModule TimingProfilerModule; TraceServices::FLoadTimeProfilerModule LoadTimeProfilerModule; TraceServices::FStatsModule StatsModule; TraceServices::FCsvProfilerModule CsvProfilerModule; TraceServices::FCountersModule CountersModule; TraceServices::FNetProfilerModule NetProfilerModule; TraceServices::FMemoryModule MemoryModule; TraceServices::FDiagnosticsModule DiagnosticsModule; TraceServices::FPlatformEventsModule PlatformEventsModule; TraceServices::FTasksModule TasksModule; TraceServices::FCookProfilerModule CookProfilingModule; }; TSharedPtr FTraceServicesModule::GetAnalysisService() { if (!AnalysisService.IsValid()) { GetModuleService(); LLM_SCOPE_BYTAG(Insights_TraceServices); AnalysisService = MakeShared(*ModuleService.Get()); } return AnalysisService; } TSharedPtr FTraceServicesModule::GetModuleService() { if (!ModuleService.IsValid()) { LLM_SCOPE_BYTAG(Insights_TraceServices); ModuleService = MakeShared(); } return ModuleService; } TSharedPtr FTraceServicesModule::CreateAnalysisService() { checkf(!AnalysisService.IsValid(), TEXT("A AnalysisService already exists.")); GetModuleService(); { LLM_SCOPE_BYTAG(Insights_TraceServices); AnalysisService = MakeShared(*ModuleService.Get()); } return AnalysisService; } TSharedPtr FTraceServicesModule::CreateModuleService() { checkf(!ModuleService.IsValid(), TEXT("A ModuleService already exists.")); { LLM_SCOPE_BYTAG(Insights_TraceServices); ModuleService = MakeShared(); } return ModuleService; } void FTraceServicesModule::StartupModule() { LLM_SCOPE_BYTAG(Insights_TraceServices); // Load the analysis module. IModuleInterface& TraceAnalysisModule = FModuleManager::LoadModuleChecked("TraceAnalysis"); IModularFeatures::Get().RegisterModularFeature(TraceServices::ModuleFeatureName, &TimingProfilerModule); IModularFeatures::Get().RegisterModularFeature(TraceServices::ModuleFeatureName, &CsvProfilerModule); IModularFeatures::Get().RegisterModularFeature(TraceServices::ModuleFeatureName, &CountersModule); IModularFeatures::Get().RegisterModularFeature(TraceServices::ModuleFeatureName, &NetProfilerModule); IModularFeatures::Get().RegisterModularFeature(TraceServices::ModuleFeatureName, &DiagnosticsModule); IModularFeatures::Get().RegisterModularFeature(TraceServices::ModuleFeatureName, &PlatformEventsModule); IModularFeatures::Get().RegisterModularFeature(TraceServices::ModuleFeatureName, &StatsModule); IModularFeatures::Get().RegisterModularFeature(TraceServices::ModuleFeatureName, &LoadTimeProfilerModule); IModularFeatures::Get().RegisterModularFeature(TraceServices::ModuleFeatureName, &MemoryModule); IModularFeatures::Get().RegisterModularFeature(TraceServices::ModuleFeatureName, &TasksModule); IModularFeatures::Get().RegisterModularFeature(TraceServices::ModuleFeatureName, &CookProfilingModule); } void FTraceServicesModule::ShutdownModule() { LLM_SCOPE_BYTAG(Insights_TraceServices); IModularFeatures::Get().UnregisterModularFeature(TraceServices::ModuleFeatureName, &CookProfilingModule); IModularFeatures::Get().UnregisterModularFeature(TraceServices::ModuleFeatureName, &TasksModule); IModularFeatures::Get().UnregisterModularFeature(TraceServices::ModuleFeatureName, &MemoryModule); IModularFeatures::Get().UnregisterModularFeature(TraceServices::ModuleFeatureName, &LoadTimeProfilerModule); IModularFeatures::Get().UnregisterModularFeature(TraceServices::ModuleFeatureName, &StatsModule); IModularFeatures::Get().UnregisterModularFeature(TraceServices::ModuleFeatureName, &PlatformEventsModule); IModularFeatures::Get().UnregisterModularFeature(TraceServices::ModuleFeatureName, &DiagnosticsModule); IModularFeatures::Get().UnregisterModularFeature(TraceServices::ModuleFeatureName, &NetProfilerModule); IModularFeatures::Get().UnregisterModularFeature(TraceServices::ModuleFeatureName, &CountersModule); IModularFeatures::Get().UnregisterModularFeature(TraceServices::ModuleFeatureName, &CsvProfilerModule); IModularFeatures::Get().UnregisterModularFeature(TraceServices::ModuleFeatureName, &TimingProfilerModule); AnalysisService.Reset(); ModuleService.Reset(); } IMPLEMENT_MODULE(FTraceServicesModule, TraceServices)