/*++ 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 #include 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; }