
#include <ngx_config.h>
#include <ngx_types.h>
#include <ngx_string.h>
#include <ngx_log.h>
#include <ngx_alloc.h>
#include <ngx_listen.h>
#include <ngx_connection.h>
#include <ngx_event.h>
#include <ngx_event_accept.h>

#include <ngx_select_module.h>
#if (HAVE_KQUEUE)
#include <ngx_kqueue_module.h>
#endif


ngx_connection_t    *ngx_connections;
ngx_event_t         *ngx_read_events, *ngx_write_events;

#if !(USE_KQUEUE)

#if 0
ngx_event_type_e     ngx_event_type = NGX_SELECT_EVENT;
#else
ngx_event_type_e     ngx_event_type = NGX_KQUEUE_EVENT;
#endif

ngx_event_actions_t  ngx_event_actions;

/* ngx_event_type_e order */
static void (*ngx_event_init[]) (int max_connections, ngx_log_t *log) = {
    ngx_select_init,
#if (HAVE_POLL)
    ngx_poll_init,
#endif
#if (HAVE_KQUEUE)
    ngx_kqueue_init
#endif
};

#endif /* USE_KQUEUE */


void ngx_pre_thread(ngx_array_t *ls, ngx_pool_t *pool, ngx_log_t *log)
{
    int  i, fd;
    ngx_listen_t *s;

    /* STUB */
    int max_connections = 512;

    ngx_init_events(max_connections, log);

    ngx_connections = ngx_alloc(sizeof(ngx_connection_t)
                                                       * max_connections, log);
    ngx_read_events = ngx_alloc(sizeof(ngx_event_t) * max_connections, log);
    ngx_write_events = ngx_alloc(sizeof(ngx_event_t) * max_connections, log);

    /* for each listening socket */
    s = (ngx_listen_t *) ls->elts;
    for (i = 0; i < ls->nelts; i++) {

        fd = s[i].fd;

        ngx_memzero(&ngx_connections[fd], sizeof(ngx_connection_t));
        ngx_memzero(&ngx_read_events[fd], sizeof(ngx_event_t));

        ngx_connections[fd].fd = fd;
        ngx_connections[fd].family = s[i].family;
        ngx_connections[fd].socklen = s[i].socklen;
        ngx_connections[fd].sockaddr = ngx_palloc(pool, s[i].socklen);
        ngx_connections[fd].addr = s[i].addr;
        ngx_connections[fd].addr_text = s[i].addr_text;
        ngx_connections[fd].addr_textlen = s[i].addr_textlen;
        ngx_connections[fd].post_accept_timeout = s[i].post_accept_timeout;

        ngx_connections[fd].server = s[i].server;
        ngx_connections[fd].handler = s[i].handler;
        ngx_connections[fd].log = s[i].log;

        ngx_test_null(ngx_read_events[fd].log,
                      ngx_palloc(pool, sizeof(ngx_log_t)), /* void */ ; );
        ngx_memcpy(ngx_read_events[fd].log, ngx_connections[fd].log,
                   sizeof(ngx_log_t));
        ngx_read_events[fd].data = &ngx_connections[fd];
        ngx_read_events[fd].event_handler = &ngx_event_accept;
        ngx_read_events[fd].listening = 1;

        ngx_read_events[fd].available = 0;

#if (HAVE_DEFERRED_ACCEPT)
        ngx_read_events[fd].deferred_accept = s[i].deferred_accept;
#endif
        ngx_add_event(&ngx_read_events[fd], NGX_READ_EVENT, 0);
    }
}

void ngx_worker(ngx_log_t *log)
{
    while (1) {
        ngx_log_debug(log, "ngx_worker cycle");

        ngx_process_events(log);
    }
}
