Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

284 lines
7.3 KiB

/*++
Copyright (C) Microsoft Corporation, 1994 - 1999
Module Name:
client.c
Abstract:
Client of post message performance test.
Author:
Mario Goertzel (mariogo) 31-Mar-1994
Revision History:
--*/
#include <rpcperf.h>
#include <pmsgtest.h>
const char *USAGE ="-n case -n size -i iterations\n"
" Cases:\n"
" 1: Oneway PostMessage/GetMessage (in process)\n"
" 2: Oneway PostMessage/GetMessage (process to process)\n"
" 3: Oneway PostMessage/MsgWaitForMultipleObjects (in process)\n"
" 4: Oneway PostMessage/MsgWaitForMultipleObjects (process to process)\n"
" 5: SendMessage/GetMessage (in process)\n"
" 6: SendMessage/GetMessage (process to process)\n"
" 7: Post/GetMessage and WSO (in process)\n"
" 8: Post/GetMessage and WSO (process to process)\n"
" 9: PostMessage/MsgWMO and WSO (in process)\n"
" 10: PostMessage/MsgWMO and WSO (process to process)\n"
" 11: SetEvent/MsgWMO and WSO (in process)\n"
" 12: SetEvent/MsgWMO and WSO (process to process)\n"
" 13: PostMessage (WM_COPYDATA of size) and WSO\n";
int __cdecl
main(int argc, char **argv)
{
HWND hwndServer;
HANDLE hReplyEvent;
HANDLE hRequestEvent;
ULONG i;
ULONG lTestCase;
ULONG lSize;
char *string;
ULONG Status;
ParseArgv(argc, argv);
if ( (Options[0] < 0) || (Options[0] > 13) )
{
printf("Usage: %s : %s\n",
argv[0],
USAGE);
return 1;
}
lTestCase = Options[0];
lSize = Options[1];
if (lSize < 1) lSize = 100;
switch(lTestCase)
{
case 1:
string = "PostMessage/GetMessage (oneway, in-process)";
break;
case 2:
string = "PostMessage/GetMessage (oneway, out-of-process)";
break;
case 3:
string = "PostMessage/MsgWaitForMultipleObjects (oneway, in-process)";
break;
case 4:
string = "PostMessage/MsgWaitForMultipleObjects (oneway, out-of-process)";
break;
case 5:
string = "SendMessage/GetMessage (in-process)";
break;
case 6:
string = "SendMessage/GetMessage (out-of-process)";
break;
case 7:
string = "PostMessage/GetMessage (in-process)";
break;
case 8:
string = "PostMessage/GetMessage (out-of-process)";
break;
case 9:
string = "PostMessage/MsgWaitForMultipleObjects (in-process)";
break;
case 10:
string = "PostMessage/MsgWaitForMultipleObjects (out-of-process)";
break;
case 11:
string = "SetEvent/MsgWaitForMultipleObjects (in-process)";
break;
case 12:
string = "SetEvent/MsgWaitForMultipleObjects (out-of-process)";
break;
case 13:
string = "PostMessage (WM_COPYDATA) WSO reply";
break;
}
hwndServer = FindWindow(CLASS, TITLE);
if (hwndServer == 0)
ApiError("FindWindow", GetLastError());
hReplyEvent = OpenEvent(EVENT_ALL_ACCESS,
FALSE,
REPLY_EVENT);
if (hReplyEvent == 0)
ApiError("OpenEvent", GetLastError());
hRequestEvent = OpenEvent(EVENT_ALL_ACCESS,
FALSE,
REQUEST_EVENT);
if (hRequestEvent == 0)
ApiError("OpenEvent", GetLastError());
switch(lTestCase)
{
case 1:
case 3:
case 5:
case 7:
case 9:
case 11:
{
StartTime();
if ( (PostMessage(hwndServer, MSG_PERF_MESSAGE,
lTestCase, Iterations)) == FALSE)
{
ApiError("PostMessage", GetLastError());
}
// The server process completes the whole test
if (WaitForSingleObject(hReplyEvent, INFINITE) != STATUS_WAIT_0)
{
ApiError("WaitForSingleObject", GetLastError());
}
break;
}
case 2:
case 4:
case 8:
case 10:
{
// Oneway and twoway PostMessages.
StartTime();
for(i = Iterations; i; i--)
{
if ( (PostMessage(hwndServer, MSG_PERF_MESSAGE,
lTestCase, i)) == FALSE)
{
ApiError("PostMessage", GetLastError());
}
if (lTestCase > 4)
{
// Twoway tests wait for reply event
if (WaitForSingleObject(hReplyEvent, INFINITE) !=
STATUS_WAIT_0)
{
ApiError("WaitForSingleObject", GetLastError());
}
}
}
// Wait for all the messages to be processed
if (lTestCase <= 4)
{
if (WaitForSingleObject(hReplyEvent, INFINITE)
!= STATUS_WAIT_0)
{
ApiError("WaitForSingleObject", GetLastError());
}
}
break;
}
case 6:
{
// SendMessage()
StartTime();
for(i = Iterations; i; i--)
{
if ( (SendMessage(hwndServer, MSG_PERF_MESSAGE,
lTestCase, i)) != 69)
{
ApiError("SendMessage", GetLastError());
}
}
// No need to wait for all the messages to be processed
break;
}
case 12:
{
// SetEvent/MsgWaitForMultipleObjects
PostMessage(hwndServer, MSG_PERF_MESSAGE, lTestCase, 0);
Sleep(100);
StartTime();
for(i = Iterations; i; i--)
{
SetEvent(hRequestEvent);
WaitForSingleObject(hReplyEvent, INFINITE);
}
break;
}
case 13:
{
// PostMessage (WM_COPYDATA) and SetEvent reply
COPYDATASTRUCT Data;
Data.dwData = 5055;
Data.cbData = lSize;
Data.lpData = malloc(lSize);
ASSERT(0);
// This doesn't build for Win64. I don't think this test
// is relevant, so I'll just comment it out to make it build
/*
StartTime();
for(i = Iterations; i; i--)
{
Status =
SendMessage(hwndServer,
WM_COPYDATA,
hwndServer,
(long)&Data);
if (Status == FALSE)
ASSERT(0);
}
*/
}
}
EndTime(string);
if (PostMessage(hwndServer, WM_DESTROY, 0, 0) == FALSE)
ApiError("PostMessage", GetLastError());
return 0;
}