void FMessageTracer::TraceAddedRecipient( const FMessageAddress& Address, const IReceiveMessagesRef& Recipient ) { double Timestamp = FPlatformTime::Seconds(); Traces.Enqueue([=]() { // create endpoint information FMessageTracerEndpointInfoPtr& EndpointInfo = RecipientsToEndpointInfos.FindOrAdd(Recipient->GetRecipientId()); if (!EndpointInfo.IsValid()) { EndpointInfo = MakeShareable(new FMessageTracerEndpointInfo()); } // initialize endpoint information FMessageTracerAddressInfoRef AddressInfo = MakeShareable(new FMessageTracerAddressInfo()); AddressInfo->Address = Address; AddressInfo->TimeRegistered = Timestamp; AddressInfo->TimeUnregistered = 0; EndpointInfo->AddressInfos.Add(Address, AddressInfo); EndpointInfo->Name = Recipient->GetDebugName(); EndpointInfo->Remote = Recipient->IsRemote(); // add to address table AddressesToEndpointInfos.Add(Address, EndpointInfo); }); }
void FMessageTracer::TraceHandledMessage( const IMessageContextRef& Context, const IReceiveMessagesRef& Recipient ) { if (!Running) { return; } double Timestamp = FPlatformTime::Seconds(); Traces.Enqueue([=]() { // look up message & endpoint info FMessageTracerMessageInfoPtr MessageInfo = MessageInfos.FindRef(Context); if (!MessageInfo.IsValid()) { return; } FMessageTracerEndpointInfoPtr EndpointInfo = RecipientsToEndpointInfos.FindRef(Recipient->GetRecipientId()); if (!EndpointInfo.IsValid()) { return; } // update message information FMessageTracerDispatchStatePtr DispatchState = MessageInfo->DispatchStates.FindRef(EndpointInfo); if (DispatchState.IsValid()) { DispatchState->TimeHandled = Timestamp; } }); }
void FMessageTracer::TraceDispatchedMessage(const IMessageContextRef& Context, const IReceiveMessagesRef& Recipient, bool Async) { if (!Running) { return; } double Timestamp = FPlatformTime::Seconds(); Traces.Enqueue([=]() { // look up message & endpoint info FMessageTracerMessageInfoPtr MessageInfo = MessageInfos.FindRef(Context); if (!MessageInfo.IsValid()) { return; } FMessageTracerEndpointInfoPtr& EndpointInfo = RecipientsToEndpointInfos.FindOrAdd(Recipient->GetRecipientId()); if (!EndpointInfo.IsValid()) { return; } // update message information FMessageTracerDispatchStateRef DispatchState = MakeShareable(new FMessageTracerDispatchState()); { DispatchState->DispatchLatency = Timestamp - MessageInfo->TimeSent; DispatchState->DispatchType = Async ? EMessageTracerDispatchTypes::TaskGraph : EMessageTracerDispatchTypes::Direct; DispatchState->EndpointInfo = EndpointInfo; DispatchState->RecipientThread = Recipient->GetRecipientThread(); DispatchState->TimeDispatched = Timestamp; DispatchState->TimeHandled = 0.0; } MessageInfo->DispatchStates.Add(EndpointInfo, DispatchState); // update database EndpointInfo->ReceivedMessages.Add(MessageInfo); }); }