1/**
2 * \file
3 * \brief Spawns an instance of self on every core,
4 * runs boot time performance tests,
5 * adds the results to skb.
6 */
7
8/*
9 * Copyright (c) 2010, ETH Zurich and Mircosoft Corporation.
10 * All rights reserved.
11 *
12 * This file is distributed under the terms in the attached LICENSE file.
13 * If you do not find this file, copies can be found by writing to:
14 * ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
15 */
16
17#include <stdio.h>
18#include "internal.h"
19
20int global_argc;
21char **global_argv;
22coreid_t my_core_id;
23
24void exit_msg(struct boot_perfmon_binding *b)
25{
26    exit(0);
27}
28
29static void tests_cb(void)
30{
31    errval_t err;
32
33    for (int i = 0; i < coreset_count(set); i++) {
34        if (i == my_core_id) {
35            continue;
36        }
37
38        // Have the other nodes exit
39        struct boot_perfmon_binding *b;
40        err = relations_get(rel, i, &b);
41        if (err_is_fail(err)) {
42            USER_PANIC_ERR(err, "relations_get failed");
43        }
44        err = boot_perfmon_exit__tx(b, NOP_CONT);
45        if (err_is_fail(err)) {
46            USER_PANIC_ERR(err, "sending exit failed");
47        }
48
49        // Print results
50        printf("With core %d, avg %"PRIuCYCLES", variance %"PRIuCYCLES"\n", i,
51               bench_avg(timestamp[i].time, MAX_COUNT),
52               bench_variance(timestamp[i].time, MAX_COUNT));
53    }
54
55    exit(0);
56}
57
58static void connect_cb(void)
59{
60    errval_t err;
61
62    /* Perform tests */
63    if (check_leader()) {
64        err = tests(tests_cb);
65        if (err_is_fail(err)) {
66            USER_PANIC_ERR(err, "connect failed");
67        }
68    }
69}
70
71static void spawn_cb(void)
72{
73    errval_t err;
74
75    /* Establish connections */
76    err = connect(connect_cb);
77    if (err_is_fail(err)) {
78        USER_PANIC_ERR(err, "connect failed");
79    }
80}
81
82static void leader_cb(void)
83{
84    errval_t err;
85
86    /* Spawn */
87    err = spawn(spawn_cb);
88    if (err_is_fail(err)) {
89        USER_PANIC_ERR(err, "spawn failed");
90    }
91}
92
93int main(int argc, char *argv[])
94{
95    errval_t err;
96
97    global_argc = argc;
98    global_argv = argv;
99    my_core_id = disp_get_core_id();
100    bench_init();
101
102    err = skb_client_connect();
103    if (err_is_fail(err)) {
104        USER_PANIC_ERR(err, "skb_client_connect failed");
105    }
106
107    /* Set leader */
108    err = set_leader(leader_cb);
109    if (err_is_fail(err)) {
110        USER_PANIC_ERR(err, "set_leader failed");
111    }
112
113    messages_handler_loop();
114}
115