mirror of https://github.com/tongzx/nt5src
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
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;
|
|
}
|
|
|