1/**
2 * \file
3 * \brief Queries the SKB to construct a multicast tree
4 */
5
6/*
7 * Copyright (c) 2007, 2008, 2009, ETH Zurich.
8 * All rights reserved.
9 *
10 * This file is distributed under the terms in the attached LICENSE file.
11 * If you do not find this file, copies can be found by writing to:
12 * ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
13 */
14
15#include <barrelfish/barrelfish.h>
16#include <stdio.h>
17#include <stdlib.h>
18#include <skb/skb.h>
19#include <barrelfish/dispatch.h>
20
21int main(int argc, char**argv)
22{
23    struct mem_aff {
24        uint64_t base, limit;
25    };
26    struct mem_aff memory_affinities[20];
27    uintptr_t idx = 0;
28    errval_t err;
29
30    char query[128];
31    coreid_t core_id = disp_get_core_id();
32
33    skb_client_connect();
34
35    sprintf(query,"local_memory_affinity(%u, List),length(List,Len),"
36                  "write(output,len(Len)),write(output,List).", core_id);
37
38    printf("\nexecute query...\n");
39
40    char *output, *errstr;
41    int32_t errint;
42    err = skb_evaluate(query, &output, &errstr, &errint);
43    assert(err_is_ok(err));
44    assert(errint == 0);
45
46    printf("\nquery executed.\n");
47    printf("\nresult = %s\n", output);
48
49    while(!((output[0] == 'l') && (output[1] == 'e') && (output[2] == 'n')))
50        output++;
51    output += 4;
52    int len = atoi(output);
53    printf("\nprocess %u elements.\n", len);
54    for (int i = 0; i < len; i++) {
55        while(!(output[0] == 'r')) output++;
56        while (!((output[0] >= '0') && (output[0] <= '9'))) output++;
57        uint64_t base = atol(output);
58        while(!(output[0] == ',')) output++;
59        while (!((output[0] >= '0') && (output[0] <= '9'))) output++;
60        uint64_t limit = atol(output);
61        memory_affinities[idx].base = base;
62        memory_affinities[idx].limit = limit;
63        idx++;
64    }
65
66    for (int i = 0; i < idx; i++) {
67        printf("found affinity %d: [%"PRIx64", %"PRIx64"]\n", i, memory_affinities[i].base,
68                memory_affinities[i].limit);
69    }
70    return 0;
71}
72