#include "ocilib.h"

#define MAX_THREADS 50

void err_handler(OCI_Error *err)
{
    printf("%s\n", OCI_ErrorGetString(err));
}

void key_cleanup(void *str)
{
    free(str);
}

void worker(OCI_Thread *thread, void *data)
{
    const void *id = OCI_HandleGetThreadID(thread);
    char *str = malloc(50);

    sprintf(str, "thread %p !\n", id);

    OCI_ThreadKeySetValue("ID", str);

    str = OCI_ThreadKeyGetValue("ID");

    printf(str);
}

int main(void)
{
    OCI_Thread *th[MAX_THREADS];
    int i;

    if (!OCI_Initialize(err_handler, NULL, OCI_ENV_DEFAULT | OCI_ENV_THREADED))
    {
        return EXIT_FAILURE;
    }

    OCI_ThreadKeyCreate("ID", key_cleanup);

    /* create threads */

    for (i = 0; i < MAX_THREADS; i++)
    {
        th[i] = OCI_ThreadCreate();
        OCI_ThreadRun(th[i], worker, NULL);
    }

    /* wait for threads and cleanup */

    for (i = 0; i < MAX_THREADS; i++)
    {
        OCI_ThreadJoin(th[i]);
        OCI_ThreadFree(th[i]);
    }

    OCI_Cleanup();

    return EXIT_SUCCESS;
}
