#include <stdio.h>
#include <stddef.h>
#include "coroutine.h"
#include "generator.h"
#include "asleep.h"
#include "task.h"

#include <dirent.h> 
#include <string.h>
#include <stdlib.h>
#include <time.h>

#define DEMO_STACK_SIZE (8192*sizeof(void *))

void *chaindeeper(void *param){
    // enough headroom for printf on an Intel Mac - your system may be different
    if (Coroutine_GetStackHeadroom() < 2000){
        void *result;
        bool fail = Coroutine_Chain(DEMO_STACK_SIZE, chaindeeper, param, &result);
        return fail ? NULL : result;
    }
    printf("%ld %ld\n", (long)param, Coroutine_GetStackHeadroom());
    long depth = (long)param;
    if (depth > 10000){
        return NULL;
    }
    return chaindeeper((void *)(depth + 1));
}


void *chaintest(
    void *param
){
    (void)param;

    chaindeeper((void *)0);

    return param;
}


int main(int argc, char *argv[]) {
    (void)argc;
    (void)argv;

    Coroutine_StartSystem();
    Coroutine_Run(DEMO_STACK_SIZE, chaintest, NULL, NULL);
    Coroutine_Report report = Coroutine_StopSystem();

    printf("%d routines using a pool of %d, min headroom %zu\n", report.coroutines_created, report.coroutines_pool_size, report.lowest_headroom);
}
