// Copyright Epic Games, Inc. All Rights Reserved. #include "FieldNotificationTraceProvider.h" #include "ObjectTrace.h" namespace UE::FieldNotification { FName FTraceProvider::ProviderName("FieldNotificationProvider"); #define LOCTEXT_NAMESPACE "FieldNotificationProvider" FTraceProvider::FObject::FObject(TraceServices::IAnalysisSession& InSession) : FieldNotifies(InSession.GetLinearAllocator()) , FieldNotifiesRecording(InSession.GetLinearAllocator()) { } FTraceProvider::FTraceProvider(TraceServices::IAnalysisSession& InSession) : Session(InSession) , ObjectLifetimes(InSession.GetLinearAllocator()) { } void FTraceProvider::EnumerateObjects(double StartTime, double EndTime, TFunctionRef Callback) const { ObjectLifetimes.EnumerateEvents(StartTime, EndTime, [this, &Callback](double InStartTime, double InEndTime, uint32 InDepth, const TSharedRef& ExistsMessage) { Callback(InStartTime, InEndTime, InDepth, ExistsMessage.Get()); return TraceServices::EEventEnumerate::Continue; }); } void FTraceProvider::EnumerateFieldNotifies(uint64 InObjectId, double InStartTime, double InEndTime, TFunctionRef Callback) const { Session.ReadAccessCheck(); const TSharedRef* Found = ObjectIdToObject.Find(InObjectId); if (Found != nullptr) { (*Found)->FieldNotifies.EnumerateEvents(InStartTime, InEndTime, [&Callback](double InNewStartTime, double InNewEndTime, uint32 InDepth, const FFieldNotifyEvent& ExistsMessage) { Callback(InNewStartTime, InNewEndTime, InDepth, ExistsMessage); return TraceServices::EEventEnumerate::Continue; }); } } void FTraceProvider::EnumerateRecordingFieldNotifies(uint64 InObjectId, double InStartTime, double InEndTime, TFunctionRef Callback) const { Session.ReadAccessCheck(); const TSharedRef* Found = ObjectIdToObject.Find(InObjectId); if (Found != nullptr) { (*Found)->FieldNotifiesRecording.EnumerateEvents(InStartTime, InEndTime, [&Callback](double InNewStartTime, double InNewEndTime, uint32 InDepth, const FFieldNotifyEvent& ExistsMessage) { Callback(InNewStartTime, InNewEndTime, InDepth, ExistsMessage); return TraceServices::EEventEnumerate::Continue; }); } } FFieldNotificationId FTraceProvider::GetFieldNotificationId(uint32 InFieldNotifyId) const { Session.ReadAccessCheck(); return FFieldNotificationId(FieldNotifyIdToFieldNotifyName.FindRef(InFieldNotifyId)); } void FTraceProvider::AppendObjectBegin(uint64 InObjectId, double InProfileTime) { Session.WriteAccessCheck(); if (!ObjectIdToObject.Contains(InObjectId)) { TSharedRef NewObject = MakeShared(Session); NewObject->SelfObjectId = InObjectId; ObjectIdToObject.Add(InObjectId, NewObject); NewObject->TimelineId = ObjectLifetimes.AppendBeginEvent(InProfileTime, NewObject); } } void FTraceProvider::AppendObjectEnd(uint64 InObjectId, double InProfileTime) { Session.WriteAccessCheck(); if (TSharedRef* Found = ObjectIdToObject.Find(InObjectId)) { ObjectLifetimes.EndEvent((*Found)->TimelineId, InProfileTime); } } void FTraceProvider::AppendFieldValueChanged(uint64 InObjectId, double InProfileTime, double InRecordingTime, uint32 InFieldNotifyId) { Session.WriteAccessCheck(); FObject* CurrentObject = nullptr; if (TSharedRef* Found = ObjectIdToObject.Find(InObjectId)) { CurrentObject = &(Found->Get()); } else { // make new object TSharedRef NewObject = MakeShared(Session); NewObject->SelfObjectId = InObjectId; ObjectIdToObject.Add(InObjectId, NewObject); NewObject->TimelineId = ObjectLifetimes.AppendBeginEvent(InProfileTime, NewObject); CurrentObject = &(NewObject.Get()); } if (CurrentObject) { FFieldNotifyEvent Value; Value.FieldNotifyId = InFieldNotifyId; CurrentObject->FieldNotifies.AppendEvent(InProfileTime, Value); CurrentObject->FieldNotifiesRecording.AppendEvent(InRecordingTime, Value); } } void FTraceProvider::AppendFieldNotify(uint32 InFieldNotifyId, FName InValue) { Session.WriteAccessCheck(); FieldNotifyIdToFieldNotifyName.FindOrAdd(InFieldNotifyId) = InValue; } } //namespace #undef LOCTEXT_NAMESPACE