// Copyright Epic Games, Inc. All Rights Reserved. /*============================================================================= UnAsyncLoading.cpp: Unreal async messsage log. =============================================================================*/ #include "Serialization/DeferredMessageLog.h" #include "Misc/ScopeLock.h" #include "Logging/TokenizedMessage.h" #include "Logging/MessageLog.h" TMap>*> FDeferredMessageLog::Messages; FCriticalSection FDeferredMessageLog::MessagesCritical; FDeferredMessageLog::FDeferredMessageLog(const FName& InLogCategory) : LogCategory(InLogCategory) { FScopeLock MessagesLock(&MessagesCritical); TArray>** ExistingCategoryMessages = Messages.Find(LogCategory); if (!ExistingCategoryMessages) { TArray>* CategoryMessages = new TArray>(); Messages.Add(LogCategory, CategoryMessages); } } void FDeferredMessageLog::AddMessage(TSharedRef& Message) { FScopeLock MessagesLock(&MessagesCritical); TArray>* CategoryMessages = Messages.FindRef(LogCategory); check(CategoryMessages); CategoryMessages->Add(Message); } TSharedRef FDeferredMessageLog::Info(const FText& InMessage) { TSharedRef Message = FTokenizedMessage::Create(EMessageSeverity::Info, InMessage); AddMessage(Message); return Message; } TSharedRef FDeferredMessageLog::Warning(const FText& InMessage) { TSharedRef Message = FTokenizedMessage::Create(EMessageSeverity::Warning, InMessage); AddMessage(Message); return Message; } TSharedRef FDeferredMessageLog::Error(const FText& InMessage) { TSharedRef Message = FTokenizedMessage::Create(EMessageSeverity::Error, InMessage); AddMessage(Message); return Message; } void FDeferredMessageLog::Flush() { FScopeLock MessagesLock(&MessagesCritical); for (auto& CategoryMessages: Messages) { if (CategoryMessages.Value->Num()) { FMessageLog LoaderLog(CategoryMessages.Key); LoaderLog.AddMessages(*CategoryMessages.Value); CategoryMessages.Value->Empty(CategoryMessages.Value->Num()); } } } void FDeferredMessageLog::Cleanup() { for (auto& CategoryMessages: Messages) { delete CategoryMessages.Value; } Messages.Empty(); }