bool FUdpMessageProcessor::EnqueueOutboundMessage( const FUdpSerializedMessageRef& SerializedMessage, const FGuid& Recipient ) { if (!OutboundMessages.Enqueue(FOutboundMessage(SerializedMessage, Recipient))) { return false; } SerializedMessage->OnStateChanged().BindRaw(this, &FUdpMessageProcessor::HandleSerializedMessageStateChanged); if (SerializedMessage->GetState() != EUdpSerializedMessageState::Incomplete) { WorkEvent->Trigger(); } return true; }
bool FUdpSerializeMessageTaskTest::RunTest(const FString& Parameters) { using namespace UdpSerializeMessageTaskTest; CompletedMessages = 0; FailedMessages = 0; ReferenceMessage = MakeShareable(new FUdpSerializedMessage); IMessageContextRef Context = MakeShareable(new FUdpMockMessageContext(new FUdpMockMessage)); // synchronous reference serialization FUdpSerializeMessageTask ReferenceTask(Context, ReferenceMessage.ToSharedRef()); { ReferenceTask.DoTask(FTaskGraphInterface::Get().GetCurrentThreadIfKnown(), FGraphEventRef()); } // stress test for (int32 TestIndex = 0; TestIndex < NumMessages; ++TestIndex) { FUdpSerializedMessageRef SerializedMessage = MakeShareable(new FUdpSerializedMessage); { SerializedMessage->OnStateChanged().BindStatic(&HandleSerializedMessageStateChanged, SerializedMessage); } TGraphTask<FUdpSerializeMessageTask>::CreateTask().ConstructAndDispatchWhenReady(Context, SerializedMessage); } FDateTime StartTime = FDateTime::UtcNow(); while ((CompletedMessages < NumMessages) && ((FDateTime::UtcNow() - StartTime) < MaxWaitTime)) { FPlatformProcess::Sleep(0.0f); } TestEqual(TEXT("The number of completed messages must equal the total number of messages"), CompletedMessages, NumMessages); TestEqual(TEXT("There must be no failed messages"), FailedMessages, (int32)0); return ((CompletedMessages == NumMessages) && (FailedMessages == 0)); }
void HandleSerializedMessageStateChanged(FUdpSerializedMessageRef SerializedMessage) { using namespace UdpSerializeMessageTaskTest; FPlatformAtomics::InterlockedIncrement(&CompletedMessages); const TArray<uint8>& ReferenceDataArray = ReferenceMessage->GetDataArray(); const TArray<uint8>& SerializedDataArray = SerializedMessage->GetDataArray(); if (ReferenceDataArray.Num() != SerializedDataArray.Num()) { FPlatformAtomics::InterlockedIncrement(&FailedMessages); } else { const void* ReferenceData = ReferenceDataArray.GetData(); const void* SerializedData = SerializedDataArray.GetData(); if (FMemory::Memcmp(ReferenceData, SerializedData, ReferenceDataArray.Num()) != 0) { FPlatformAtomics::InterlockedIncrement(&FailedMessages); } } }