
/*
 * Copyright (C) Igor Sysoev
 */


#include <ngx_config.h>
#include <ngx_core.h>


ngx_int_t      ngx_threads_n;


static size_t  stack_size;


ngx_err_t
ngx_create_thread(ngx_tid_t *tid,
    ngx_thread_value_t (__stdcall *func)(void *arg), void *arg, ngx_log_t *log)
{
    u_long     id;
    ngx_err_t  err;

    *tid = CreateThread(NULL, stack_size, func, arg, 0, &id);

    if (*tid != NULL) {
        ngx_log_error(NGX_LOG_NOTICE, log, 0,
                      "create thread " NGX_TID_T_FMT, id);
        return 0;
    }

    err = ngx_errno;
    ngx_log_error(NGX_LOG_ALERT, log, err, "CreateThread() failed");
    return err;
}


ngx_int_t
ngx_init_threads(int n, size_t size, ngx_cycle_t *cycle)
{
    stack_size = size;

    return NGX_OK;
}


ngx_err_t
ngx_thread_key_create(ngx_tls_key_t *key)
{
    *key = TlsAlloc();

    if (*key == TLS_OUT_OF_INDEXES) {
        return ngx_errno;
    }

    return 0;
}


ngx_err_t
ngx_thread_set_tls(ngx_tls_key_t *key, void *data)
{
    if (TlsSetValue(*key, data) == 0) {
        return ngx_errno;
    }

    return 0;
}


ngx_mutex_t *
ngx_mutex_init(ngx_log_t *log, ngx_uint_t flags)
{
    return (ngx_mutex_t *) 1;
}


/* STUB */

void
ngx_mutex_lock(ngx_mutex_t *m) {
    return;
}



ngx_int_t
ngx_mutex_trylock(ngx_mutex_t *m) {
    return NGX_OK;
}


void
ngx_mutex_unlock(ngx_mutex_t *m) {
    return;
}

/**/
