Ticket #15509: Main.c

File Main.c, 1.4 KB (added by X512, 4 years ago)

Benchmark code for Windows.

Line 
1#include <windows.h>
2#include <stdio.h>
3#include <stdbool.h>
4
5enum {
6 stepCnt = 100000
7};
8
9enum {
10 exitOp = 1,
11 stepOp = 2
12};
13
14HANDLE thread; DWORD threadId;
15HANDLE reqEvt, replEvt;
16int op;
17int inArg, outArg;
18
19void debugger(const char *msg)
20{
21 MessageBox(NULL, msg, "Error", MB_OK|MB_ICONERROR);
22 ExitProcess(1);
23}
24
25DWORD WINAPI ThreadEntry(void *arg)
26{
27 bool run = true;
28 while (run) {
29 WaitForSingleObject(reqEvt, INFINITE);
30 switch (op) {
31 case exitOp: run = false; break;
32 case stepOp: outArg = inArg + 1; break;
33 default: debugger("unknown op");
34 }
35 SetEvent(replEvt);
36 }
37 return 0;
38}
39
40int main()
41{
42 int t1, t2;
43 reqEvt = CreateEvent(NULL, FALSE, FALSE, NULL);
44 replEvt = CreateEvent(NULL, FALSE, FALSE, NULL);
45 thread = CreateThread(NULL, 0, ThreadEntry, NULL, 0, &threadId);
46 // single core mode
47#if 0
48 SetThreadAffinityMask(GetCurrentThread(), 1);
49 SetThreadAffinityMask(thread, 1);
50#endif
51 t1 = GetTickCount();
52 for (int i = 0; i < stepCnt; i++) {
53 inArg = i;
54 op = stepOp; SetEvent(reqEvt);
55 WaitForSingleObject(replEvt, INFINITE);
56 if (outArg != inArg + 1) {debugger("invalid outArg");}
57 }
58 t2 = GetTickCount();
59 printf("%f\n", stepCnt/((t2-t1)/1000.0));
60 op = exitOp; SetEvent(reqEvt);
61 WaitForSingleObject(replEvt, INFINITE);
62 WaitForSingleObject(thread, INFINITE);
63 CloseHandle(thread);
64 CloseHandle(reqEvt);
65 CloseHandle(replEvt);
66 return 0;
67}