restored
[charm.git] / tests / converse / commbench / commbench.c
1  /**************************************************************************
2  * DESCRIPTION:
3  *
4  * To add a test to commbench, you have to:
5  *
6  *   1. write a testname_moduleinit function that initializes the module.
7  *   2. write a testname_init function that starts the test.
8  *   3. declare the testname_init function inside this module.
9  *   4. extend the tests[] table in this module to include the new test.
10  *
11  **************************************************************************/
12
13 #include <stdio.h>
14 #include <converse.h>
15 #include "commbench.h"
16
17 /******************************************************************************
18  *
19  * Test Configuration Section
20  *
21  *****************************************************************************/
22
23 extern void overhead_init(void);
24 extern void timer_init(void);
25 extern void proc_init(void);
26 extern void smputil_init(void);
27 extern void pingpong_init(void);
28 extern void ctxt_init(void);
29
30 extern void overhead_moduleinit(void);
31 extern void timer_moduleinit(void);
32 extern void proc_moduleinit(void);
33 extern void smputil_moduleinit(void);
34 extern void pingpong_moduleinit(void);
35 extern void ctxt_moduleinit(void);
36
37 struct testinfo
38 {
39   char *name;
40   void (*initiator)(void);
41   void (*initializer)(void);
42 } tests[] = {
43   { "overhead",  overhead_init,  overhead_moduleinit },
44   { "timer",     timer_init,     timer_moduleinit },
45   { "proc",      proc_init,      proc_moduleinit },
46   { "smputil",   smputil_init,   smputil_moduleinit },
47   { "pingpong",  pingpong_init,  pingpong_moduleinit },
48   { "ctxt",      ctxt_init,      ctxt_moduleinit },
49   { 0,0,0 },
50 };
51
52 /******************************************************************************
53  *
54  * Central Control Section
55  *
56  *****************************************************************************/
57
58 CpvStaticDeclare(int, test_bank_size);
59 CpvStaticDeclare(int, test_negate_skip);
60 CpvStaticDeclare(char **, tests_to_skip);
61 CpvStaticDeclare(int, num_tests_to_skip);
62 CpvStaticDeclare(int, next_test_index);
63 CpvStaticDeclare(int, shutdown_handler);
64 CpvDeclare(int, ack_handler);
65
66 void commbench_shutdown(void *msg)
67 {
68   CmiFree(msg);
69   CsdExitScheduler();
70 }
71
72 int commbench_skip(char *test)
73 {
74   int i;
75   int num_skip = CpvAccess(num_tests_to_skip);
76   char **skip;
77   /* default mode where no tests are skipped */
78   if(num_skip==0) return 0;
79
80   skip = CpvAccess(tests_to_skip);
81   for (i=0; i<num_skip; i++) {
82     if (strcmp(skip[i+2], test)==0)
83       return 0; 
84   }
85   return 1;
86 }
87
88 void commbench_next()
89 {
90   int idx, bank;
91   EmptyMsg msg;
92
93   bank = CpvAccess(test_bank_size);
94 nextidx:
95   idx = CpvAccess(next_test_index);
96   if (idx < bank) {
97     if (commbench_skip(tests[idx].name)) {
98       CpvAccess(next_test_index)++;
99       goto nextidx;
100     }
101     CmiPrintf("[%s] initiated\n", tests[idx].name);
102     (tests[idx].initiator)();
103     return; 
104   }
105   if (idx==bank) {
106     CmiPrintf("All benchmarks completed, exiting...\n");
107     CmiSetHandler(&msg, CpvAccess(shutdown_handler));
108     CmiSyncBroadcastAll(sizeof(EmptyMsg), &msg);
109     return;
110   }
111 }
112
113 void commbench_ack(void *msg)
114 {
115   CmiFree(msg);
116   CpvAccess(next_test_index)++;
117   commbench_next();
118 }
119
120 void commbench_init(int argc, char **argv)
121 {
122   int numtests, i;
123   CpvInitialize(int, shutdown_handler);
124   CpvInitialize(int, ack_handler);
125   CpvAccess(shutdown_handler) = CmiRegisterHandler((CmiHandler)commbench_shutdown);
126   CpvAccess(ack_handler) = CmiRegisterHandler((CmiHandler)commbench_ack);
127   for (i=0; (tests[i].initializer); i++)
128     (tests[i].initializer)();
129   CpvInitialize(int, test_bank_size);
130   CpvInitialize(int, test_negate_skip);
131   CpvInitialize(int, num_tests_to_skip);
132   CpvInitialize(char **, tests_to_skip);
133   CpvInitialize(int, next_test_index);
134   for (numtests=0; tests[numtests].name; numtests++);
135   CpvAccess(test_bank_size) = numtests;
136   CpvAccess(next_test_index) = 0;
137   CpvAccess(test_negate_skip)=0;
138   for (i=1; i<argc; i++)
139     if (strcmp(argv[i],"-only")==0)
140       CpvAccess(test_negate_skip)=1;
141   CpvAccess(num_tests_to_skip) = 0;
142   if(CpvAccess(test_negate_skip)) {
143     CpvAccess(num_tests_to_skip) = argc-2;
144   }
145   CpvAccess(tests_to_skip) = argv;
146
147   if (CmiMyPe()==0)
148     commbench_next();
149 }
150
151 int main(int argc, char **argv)
152 {
153   ConverseInit(argc,argv,commbench_init,0,0);
154 }