root/src/tests/system/libroot/posix/pthread_attr_stack_test.cpp
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>

#define panic(str) if (ret != 0) { errno = ret; perror(str); return 1; }


void*
threadFunction(void*)
{
        int i = 0;
        printf("variable addr: %p\n", &i);
        pthread_exit(0);
        return 0;
}


int
main(int argc, char **argv)
{
        int ret;
        pthread_attr_t attr;
        ret = pthread_attr_init(&attr);
        panic("init");
        void* stackAddress;
        size_t stackSize;
        ret = pthread_attr_getstack(&attr, &stackAddress, &stackSize);
        panic("getstack");
        printf("stackAddress: %p, stackSize: %lu\n", stackAddress, stackSize);
        stackSize = PTHREAD_STACK_MIN;
        ret = posix_memalign(&stackAddress, sysconf(_SC_PAGE_SIZE),
                stackSize);
        panic("memalign");
        ret = pthread_attr_setstack(&attr, stackAddress, stackSize);
        panic("setstack");
        ret = pthread_attr_getstack(&attr, &stackAddress, &stackSize);
        panic("getstack");
        printf("stackAddress: %p, stackSize: %lu\n", stackAddress, stackSize);

        pthread_t thread;
        ret = pthread_create(&thread, &attr, threadFunction, NULL);
        panic("create");
        ret = pthread_join(thread, NULL);
        panic("join");

        ret = pthread_attr_destroy(&attr);
        panic("destroy");

        return 0;
}