2a5ce89ebabe23cba02279273be30ae772933aba
[akaros.git] / user / utest / pvcalarm.c
1 #include <utest.h>
2 #include <pthread.h>
3 #include <pvcalarm.h>
4
5 TEST_SUITE("PVCALARMS");
6
7 /* <--- Begin definition of test cases ---> */
8 bool test_pvcalarms(void) {
9         const int INTERVAL = 10000;
10         const int ITERATIONS = 100;
11         int count[max_vcores()];
12         void pvcalarm_callback()
13         {
14                 __sync_fetch_and_add(&count[vcore_id()], 1);
15         }
16
17         pthread_lib_init();
18         pthread_can_vcore_request(FALSE);
19         vcore_request(max_vcores() - num_vcores());
20         for (int i=0; i<max_vcores(); i++)
21                 count[i] = 0;
22         
23         uint64_t now, then;
24         now = tsc2usec(read_tsc());
25         enable_pvcalarms(PVCALARM_PROF, INTERVAL, pvcalarm_callback);
26         for (int i=0; i<max_vcores(); i++)
27                 while(count[i] < ITERATIONS)
28                         cpu_relax();
29         then = tsc2usec(read_tsc());
30         disable_pvcalarms();
31
32         UT_ASSERT_M("Alarms finished too soon", then > (now + INTERVAL*count[0]));
33         UT_ASSERT_M("Alarms finished too late", then < (now + 2*INTERVAL*count[0]));
34         return true;
35 }
36
37 /* <--- End definition of test cases ---> */
38
39 struct utest utests[] = {
40         UTEST_REG(pvcalarms),
41 };
42 int num_utests = sizeof(utests) / sizeof(struct utest);
43
44 int main(int argc, char *argv[]) {
45         // Run test suite passing it all the args as whitelist of what tests to run.
46         char **whitelist = &argv[1];
47         int whitelist_len = argc - 1;
48         RUN_TEST_SUITE(utests, num_utests, whitelist, whitelist_len);
49 }