aboutsummaryrefslogtreecommitdiff
path: root/test/instr_demo.c
blob: 7983b824d912a7171230740be945a1d797139a43 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
// a fully instrumented demo: built with -finstrument-functions so EVERY function
// here is traced automatically, no hand-picking. kept in plain C with only
// printf and nanosleep so the trace is exactly these functions
#include <stdio.h>
#include <time.h>

static void nap(long ms)
{
    struct timespec ts = { ms / 1000, (ms % 1000) * 1000000L };
    nanosleep(&ts, NULL);
}

static long leaf(int n)
{
    long total = 0;
    for (int i = 0; i < n * 40000; ++i)
        total += i % 7;

    return total;
}

static long inner(int round)
{
    long total = 0;
    for (int i = 1; i <= 3; ++i)
        total += leaf(round % 4 + i);

    return total;
}

static long outer(int round)
{
    const long a = inner(round);
    nap(20);
    const long b = inner(round + 1);
    return a + b;
}

int main(void)
{
    for (int round = 0; round < 15; ++round)
    {
        const long result = outer(round);
        printf("round %d -> %ld\n", round, result);
        fflush(stdout);
        nap(120);
    }

    puts("done");
    return 0;
}