1 | #include <OS.h>
|
---|
2 | #include <image.h>
|
---|
3 | #include <stdio.h>
|
---|
4 | #include <stdlib.h>
|
---|
5 |
|
---|
6 | enum {
|
---|
7 | second = 1000000,
|
---|
8 | stepCnt = 10000000
|
---|
9 | };
|
---|
10 |
|
---|
11 |
|
---|
12 | int main(int argc, char** argv)
|
---|
13 | {
|
---|
14 | switch (argc) {
|
---|
15 | case 1: {
|
---|
16 | sem_id reqSem = create_sem(0, "test req sem");
|
---|
17 | sem_id replSem = create_sem(0, "test repl sem");
|
---|
18 | char reqSemStr[32];
|
---|
19 | char replSemStr[32];
|
---|
20 | sprintf(reqSemStr, "%" B_PRId32, reqSem);
|
---|
21 | sprintf(replSemStr, "%" B_PRId32, replSem);
|
---|
22 | const char *childArgv[] = {
|
---|
23 | argv[0],
|
---|
24 | reqSemStr,
|
---|
25 | replSemStr,
|
---|
26 | };
|
---|
27 | team_id childTeam = load_image(3, childArgv, (const char**)environ);
|
---|
28 | resume_thread(childTeam);
|
---|
29 | bigtime_t t1 = system_time();
|
---|
30 | for (int i = 0; i < stepCnt; i++) {
|
---|
31 | release_sem(reqSem);
|
---|
32 | while (acquire_sem(replSem) == B_INTERRUPTED) {}
|
---|
33 | }
|
---|
34 | bigtime_t t2 = system_time();
|
---|
35 | printf("round trip: %f\n", double(stepCnt)/((t2 - t1)/double(second)));
|
---|
36 | printf("context switches: %f\n", 2*double(stepCnt)/((t2 - t1)/double(second)));
|
---|
37 | status_t res;
|
---|
38 | wait_for_thread(childTeam, &res);
|
---|
39 | delete_sem(reqSem); reqSem = -1;
|
---|
40 | delete_sem(replSem); replSem = -1;
|
---|
41 | return 0;
|
---|
42 | }
|
---|
43 | case 3: {
|
---|
44 | sem_id reqSem = atoi(argv[1]);
|
---|
45 | sem_id replSem = atoi(argv[2]);
|
---|
46 | for (uint32 i = 0; i < stepCnt; i++) {
|
---|
47 | while (acquire_sem(reqSem) == B_INTERRUPTED) {}
|
---|
48 | release_sem(replSem);
|
---|
49 | }
|
---|
50 | return 0;
|
---|
51 | }
|
---|
52 | default:
|
---|
53 | return 1;
|
---|
54 | }
|
---|
55 | }
|
---|