Blame winpr/libwinpr/utils/test/TestMessagePipe.c

Packit Service fa4841
Packit Service fa4841
#include <winpr/crt.h>
Packit Service fa4841
#include <winpr/thread.h>
Packit Service fa4841
#include <winpr/collections.h>
Packit Service fa4841
Packit Service fa4841
static DWORD WINAPI message_echo_pipe_client_thread(LPVOID arg)
Packit Service fa4841
{
Packit Service fa4841
	int index = 0;
Packit Service fa4841
	wMessagePipe* pipe = (wMessagePipe*)arg;
Packit Service fa4841
Packit Service fa4841
	while (index < 100)
Packit Service fa4841
	{
Packit Service fa4841
		wMessage message;
Packit Service fa4841
		int count;
Packit Service fa4841
Packit Service fa4841
		if (!MessageQueue_Post(pipe->In, NULL, 0, (void*)(size_t)index, NULL))
Packit Service fa4841
			break;
Packit Service fa4841
Packit Service fa4841
		if (!MessageQueue_Wait(pipe->Out))
Packit Service fa4841
			break;
Packit Service fa4841
Packit Service fa4841
		if (!MessageQueue_Peek(pipe->Out, &message, TRUE))
Packit Service fa4841
			break;
Packit Service fa4841
Packit Service fa4841
		if (message.id == WMQ_QUIT)
Packit Service fa4841
			break;
Packit Service fa4841
Packit Service fa4841
		count = (int)(size_t)message.wParam;
Packit Service fa4841
Packit Service fa4841
		if (count != index)
Packit Service fa4841
			printf("Echo count mismatch: Actual: %d, Expected: %d\n", count, index);
Packit Service fa4841
Packit Service fa4841
		index++;
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	MessageQueue_PostQuit(pipe->In, 0);
Packit Service fa4841
Packit Service fa4841
	return 0;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
static DWORD WINAPI message_echo_pipe_server_thread(LPVOID arg)
Packit Service fa4841
{
Packit Service fa4841
	wMessage message;
Packit Service fa4841
	wMessagePipe* pipe;
Packit Service fa4841
Packit Service fa4841
	pipe = (wMessagePipe*)arg;
Packit Service fa4841
Packit Service fa4841
	while (MessageQueue_Wait(pipe->In))
Packit Service fa4841
	{
Packit Service fa4841
		if (MessageQueue_Peek(pipe->In, &message, TRUE))
Packit Service fa4841
		{
Packit Service fa4841
			if (message.id == WMQ_QUIT)
Packit Service fa4841
				break;
Packit Service fa4841
Packit Service fa4841
			if (!MessageQueue_Dispatch(pipe->Out, &message))
Packit Service fa4841
				break;
Packit Service fa4841
		}
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	return 0;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
int TestMessagePipe(int argc, char* argv[])
Packit Service fa4841
{
Packit Service fa4841
	HANDLE ClientThread = NULL;
Packit Service fa4841
	HANDLE ServerThread = NULL;
Packit Service fa4841
	wMessagePipe* EchoPipe = NULL;
Packit Service fa4841
	int ret = 1;
Packit Service fa4841
Packit Service fa4841
	if (!(EchoPipe = MessagePipe_New()))
Packit Service fa4841
	{
Packit Service fa4841
		printf("failed to create message pipe\n");
Packit Service fa4841
		goto out;
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	if (!(ClientThread =
Packit Service fa4841
	          CreateThread(NULL, 0, message_echo_pipe_client_thread, (void*)EchoPipe, 0, NULL)))
Packit Service fa4841
	{
Packit Service fa4841
		printf("failed to create client thread\n");
Packit Service fa4841
		goto out;
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	if (!(ServerThread =
Packit Service fa4841
	          CreateThread(NULL, 0, message_echo_pipe_server_thread, (void*)EchoPipe, 0, NULL)))
Packit Service fa4841
	{
Packit Service fa4841
		printf("failed to create server thread\n");
Packit Service fa4841
		goto out;
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	WaitForSingleObject(ClientThread, INFINITE);
Packit Service fa4841
	WaitForSingleObject(ServerThread, INFINITE);
Packit Service fa4841
Packit Service fa4841
	ret = 0;
Packit Service fa4841
Packit Service fa4841
out:
Packit Service fa4841
	if (EchoPipe)
Packit Service fa4841
		MessagePipe_Free(EchoPipe);
Packit Service fa4841
	if (ClientThread)
Packit Service fa4841
		CloseHandle(ClientThread);
Packit Service fa4841
	if (ServerThread)
Packit Service fa4841
		CloseHandle(ServerThread);
Packit Service fa4841
Packit Service fa4841
	return ret;
Packit Service fa4841
}