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

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