Minor changes.
[barrelfish] / usr / bench / mem_bench / memeasy.c
1 /**
2  * \file
3  * \brief Simple Memory Benchmark to test kernel infrastructure
4  */
5 /*
6  * Copyright (c) 2013, ETH Zurich.
7  * All rights reserved.
8  *
9  * This file is distributed under the terms in the attached LICENSE file.
10  * If you do not find this file, copies can be found by writing to:
11  * ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
12  */
13
14 #include <stdlib.h>
15 #include <stdio.h>
16 #include <string.h>
17 #include <assert.h>
18
19 #include <barrelfish/barrelfish.h>
20 #include <barrelfish/deferred.h>
21 #include <bench/bench.h>
22
23 #define MAX_ITERATION 1000
24
25 static void set_true(void* arg) {
26     *(bool*)arg = true;
27 }
28
29 static void sleep_until(delayus_t delay) {
30     struct deferred_event de;
31     deferred_event_init(&de);
32
33     bool can_continue = false;
34
35     struct event_closure ec;
36     ec.handler = set_true;
37     ec.arg = &can_continue;
38
39     errval_t err = deferred_event_register(&de, get_default_waitset(),
40                                            delay, ec);
41     if (err_is_fail(err)) {
42         USER_PANIC_ERR(err, "deferred event register failed.");
43     }
44
45     //printf("%s:%s:%d\n", __FILE__, __FUNCTION__, __LINE__);
46     while(!can_continue) {
47         messages_wait_and_handle_next();
48     }
49     //printf("%s:%s:%d\n", __FILE__, __FUNCTION__, __LINE__);
50 }
51
52 int main(int argc, char** argv)
53 {
54     uint64_t sleep = 0;
55     uint64_t ram_bits = 20;
56     printf("%s:%s:%d: argc = %d\n", __FILE__, __FUNCTION__, __LINE__, argc);
57     if (argc > 3) {
58         printf("%s:%s:%d: Usage: %s <ram bits> <sleep ms>\n",
59                __FILE__, __FUNCTION__, __LINE__, argv[0]);
60     } else if (argc == 3) {
61         sleep = atoll(argv[2]);
62         ram_bits = atoll(argv[1]);
63     } else if (argc == 2) {
64         ram_bits = atoll(argv[1]);
65     }
66     printf("%s:%s:%d: Use ram_bits = %"PRIu64"\n",
67        __FILE__, __FUNCTION__, __LINE__, ram_bits);
68     printf("%s:%s:%d: Use sleep = %"PRIu64"\n",
69         __FILE__, __FUNCTION__, __LINE__, sleep);
70
71     bench_init();
72     cycles_t runs[MAX_ITERATION];
73
74     errval_t err;
75     uint64_t start, end;
76
77     struct capref ram;
78     err = ram_alloc(&ram, ram_bits);
79     if (err_is_fail(err)) {
80         USER_PANIC_ERR(err, "ram_alloc failed.");
81     }
82
83     struct capref frame;
84     err = slot_alloc(&frame);
85     if (err_is_fail(err)) {
86         USER_PANIC_ERR(err, "slot_alloc failed.");
87     }
88
89     for (size_t i=0; i<MAX_ITERATION; i++) {
90         //printf("%s:%s:%d: i=%"PRIu64"\n",
91         //       __FILE__, __FUNCTION__, __LINE__, i);
92         start = bench_tsc();
93         //printf("%s:%s:%d: \n", __FILE__, __FUNCTION__, __LINE__);
94         err = cap_retype(frame, ram, ObjType_Frame, ram_bits);
95         if (err_is_fail(err)) {
96             USER_PANIC_ERR(err, "cap_retype failed.");
97         }
98         end = bench_tsc();
99
100         err = cap_delete(frame);
101         if (err_is_fail(err)) {
102             USER_PANIC_ERR(err, "cap_delete failed.");
103         }
104
105         if (sleep > 0) {
106             sleep_until(sleep);
107         }
108
109         runs[i] = end - start;
110     }
111
112     runs[0] = BENCH_IGNORE_WATERMARK;
113
114     printf("Average cycles %"PRIuCYCLES", Variance %"PRIuCYCLES"\n \
115            Average ms %"PRIu64" Variance ms %"PRIu64"\n",
116             bench_tsc_to_ms(bench_avg(runs, MAX_ITERATION)),
117             bench_tsc_to_ms(bench_variance(runs, MAX_ITERATION)));
118
119     return 0;
120 }