|
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 |
}
|