
/*
 * Copyright (C) Igor Sysoev
 * Copyright (C) Nginx, Inc.
 */


#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)
{
    ngx_mutex_t  *m;

    m = ngx_alloc(sizeof(ngx_mutex_t), log);
    if (m == NULL) {
        return NULL;
    }

    m->log = log;

    /* STUB */

    return m;
}


/* 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;
}

/**/
