Ticket #15509: ThreadTests.cpp

File ThreadTests.cpp, 1.2 KB (added by X512, 4 years ago)

Benchmark code for Haiku.

Line 
1#include <OS.h>
2#include <stdio.h>
3
4enum {
5 stepCnt = 100000
6};
7
8enum {
9 exitOp = 1,
10 stepOp = 2
11};
12
13thread_id thread;
14sem_id reqSem;
15sem_id replSem;
16int op;
17int inArg, outArg;
18
19int32 ThreadEntry(void *arg)
20{
21 bool run = true;
22 while (run) {
23 while (acquire_sem(reqSem) == B_INTERRUPTED) {}
24 switch (op) {
25 case exitOp: run = false; break;
26 case stepOp: outArg = inArg + 1; break;
27 default: debugger("unknown op");
28 }
29 release_sem(replSem);
30 }
31 return 0;
32}
33
34int main()
35{
36 bigtime_t t1, t2;
37 status_t res;
38 reqSem = create_sem(0, "test req sem");
39 replSem = create_sem(0, "test repl sem");
40 thread = spawn_thread(ThreadEntry, "test thread", B_NORMAL_PRIORITY, NULL);
41 resume_thread(thread);
42 t1 = system_time();
43 for (int i = 0; i < stepCnt; i++) {
44 inArg = i;
45 op = stepOp; release_sem(reqSem);
46 while (acquire_sem(replSem) == B_INTERRUPTED) {}
47 if (outArg != inArg + 1) {debugger("invalid outArg");}
48 }
49 t2 = system_time();
50 printf("%f\n", stepCnt/((t2 - t1)/1000000.0));
51 op = exitOp; release_sem(reqSem);
52 while (acquire_sem(replSem) == B_INTERRUPTED) {}
53 wait_for_thread(thread, &res);
54 delete_sem(reqSem); reqSem = 0;
55 delete_sem(replSem); replSem = 0;
56 return 0;
57}
58