#include <stdio.h>
#include <ucontext.h>

static ucontext_t ctx[3];

void *f1(int x)
{
    printf("start f1: %d\n", x);
    swapcontext(&ctx[1], &ctx[2]);
    printf("finish f1: %d\n", x);
    return NULL;
}

void *f2(int x)
{
    printf("start f2: %d\n", x);
    swapcontext(&ctx[2], &ctx[1]);
    printf("finish f2: %d\n", x);
    return NULL;
}

int main(int argc, char *argv[])
{
    char st1[8192];
    char st2[8192];

    getcontext(&ctx[1]);
    ctx[1].uc_stack.ss_sp   = st1;
    ctx[1].uc_stack.ss_size = sizeof st1;
    ctx[1].uc_link          = &ctx[0];
    makecontext(&ctx[1], (void(*)())f1, 1, 300);

    getcontext(&ctx[2]);
    ctx[2].uc_stack.ss_sp   = st2;
    ctx[2].uc_stack.ss_size = sizeof st2;
    ctx[2].uc_link          = &ctx[1];
    makecontext(&ctx[2], (void(*)())f2, 1, 400);

    // saves current context into [0], runs [2] ...
    swapcontext(&ctx[0], &ctx[2]);
    return 0;
}
