コード例 #1
0
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);
		}
	}
}