From 0c331d9f666b4f9be91009b7caea457e58a80779 Mon Sep 17 00:00:00 2001 From: Igor Sysoev Date: Thu, 15 Aug 2002 17:20:26 +0000 Subject: nginx-0.0.1-2002-08-15-21:20:26 import --- src/event/modules/ngx_overlapped_module.c | 34 +++++++++++++++--- src/event/ngx_event.h | 22 +++++++++--- src/event/ngx_event_mutex.c | 14 ++++++++ src/event/ngx_event_read.c | 55 ---------------------------- src/event/ngx_event_recv.c | 60 +++++++++++++++++++++++++++++++ src/event/ngx_event_write.c | 57 ++++++++++++++--------------- 6 files changed, 147 insertions(+), 95 deletions(-) create mode 100644 src/event/ngx_event_mutex.c delete mode 100644 src/event/ngx_event_read.c create mode 100644 src/event/ngx_event_recv.c (limited to 'src/event') diff --git a/src/event/modules/ngx_overlapped_module.c b/src/event/modules/ngx_overlapped_module.c index 2bb4d7f69..c3af39dce 100644 --- a/src/event/modules/ngx_overlapped_module.c +++ b/src/event/modules/ngx_overlapped_module.c @@ -1,17 +1,41 @@ + + event = WSACreateEvent(void); + WSAEventSelect(s, event, FD_ACCEPT); + + int ngx_overlapped_process_events(ngx_log_t *log) { if (acceptex) - event = SleepEx(timer, 1); + n = SleepEx(timer, 1); else - event = WSAWaitForMultipleEvents(n_events, events, 0, timer, 1); + n = WSAWaitForMultipleEvents(nevents, events, 0, timer, 1); + + if (n == WSA_WAIT_TIMEOUT) + close some event; + + if (n == WSA_IO_COMPLETION) + again + + /* try it with AcceptEx() on NT to detect connected sockets */ + if (!acceptex) { + WSAEnumNetworkEvents( + sockets[n - WSA_WAIT_EVENT_0], + events[n - WSA_WAIT_EVENT_0], + net_events); + + if (net_events.lNetworkEvents & FD_ACCEPT) { + if (net_events.iErrorCode[FD_ACCEPT_BIT] != 0) + accept error + again - if (event == WSA_IO_COMPLETION) - look ready array + ngx_event_accept(); OR post AcceptEx(); + } + } } void CALLBACK overlapped_completion_procedure(DWORD error, DWORD nbytes, LPWSAOVERLAPPED overlapped, DWORD flags) { - push overlapped; + run event handler } diff --git a/src/event/ngx_event.h b/src/event/ngx_event.h index 7087e6950..9f758d33a 100644 --- a/src/event/ngx_event.h +++ b/src/event/ngx_event.h @@ -16,8 +16,8 @@ struct ngx_event_s { void *context; char *action; - ngx_event_t *prev; /* queue in select(), poll() */ - ngx_event_t *next; + ngx_event_t *prev; /* queue in select(), poll(), mutex(), */ + ngx_event_t *next; /* aio_read(), aio_write() */ int (*timer_handler)(ngx_event_t *ev); ngx_event_t *timer_prev; @@ -52,7 +52,7 @@ struct ngx_event_s { #endif #if (HAVE_KQUEUE) unsigned eof:1; - int errno; + int error; #endif }; @@ -70,12 +70,20 @@ typedef struct { int (*add)(ngx_event_t *ev, int event, u_int flags); int (*del)(ngx_event_t *ev, int event); int (*process)(ngx_log_t *log); -/* int (*read)(ngx_event_t *ev, char *buf, size_t size); +/* int (*write)(ngx_event_t *ev, char *buf, size_t size); */ } ngx_event_actions_t; +/* + +NGX_LEVEL_EVENT (default) select, poll, kqueue + requires to read whole data +NGX_ONESHOT_EVENT kqueue +NGX_CLEAR_EVENT kqueue + +*/ #if (HAVE_KQUEUE) @@ -99,15 +107,21 @@ typedef struct { #if (USE_KQUEUE) + #define ngx_init_events ngx_kqueue_init #define ngx_process_events ngx_kqueue_process_events #define ngx_add_event ngx_kqueue_add_event #define ngx_del_event ngx_kqueue_del_event +#define ngx_event_recv ngx_event_recv_core + #else + #define ngx_init_events (ngx_event_init[ngx_event_type]) #define ngx_process_events ngx_event_actions.process #define ngx_add_event ngx_event_actions.add #define ngx_del_event ngx_event_actions.del +#define ngx_event_recv ngx_event_recv_core + #endif diff --git a/src/event/ngx_event_mutex.c b/src/event/ngx_event_mutex.c new file mode 100644 index 000000000..5a9542b06 --- /dev/null +++ b/src/event/ngx_event_mutex.c @@ -0,0 +1,14 @@ + +spinlock_max depend on CPU number and mutex type. + 1 CPU 1 + ngx_malloc_mutex 1000 ? + + +int ngx_event_mutex_trylock(ngx_mutex_t *mtx) +{ + for(i = mtx->spinlock_max; i; i--) + if (trylock(mtx->lock)) + return 1; + + return 0; +} diff --git a/src/event/ngx_event_read.c b/src/event/ngx_event_read.c deleted file mode 100644 index b08e5107e..000000000 --- a/src/event/ngx_event_read.c +++ /dev/null @@ -1,55 +0,0 @@ - -#include -#include -#include -#include - -int ngx_event_recv(ngx_connection_t *c, char *buf, size_t size) -{ - int n; - ngx_err_t err; - ngx_event_t *ev = c->read; - -#if (HAVE_KQUEUE) -#if !(USE_KQUEUE) - if (ngx_event_type == NGX_KQUEUE_EVENT) -#endif - if (ev->eof && ev->available == 0) { - if (ev->error) { - ngx_log_error(NGX_LOG_ERR, ev->log, ev->error, - "ngx_event_recv: recv failed while %s", - ev->log->action); - - return -1; - } - - return 0; - } -#endif - - n = recv(c->fd, buf, size, 0); - - if (n == -1) { - err = ngx_socket_errno; - - if (err == NGX_EAGAIN) { - ngx_log_error(NGX_LOG_INFO, ev->log, err, - "ngx_event_recv: EAGAIN while %s", ev->log->action); - return -2; - } - - ngx_log_error(NGX_LOG_INFO, ev->log, err, - "ngx_event_recv: recv failed while %s", ev->log->action); - - return -1; - } - -#if (HAVE_KQUEUE) -#if !(USE_KQUEUE) - if (ngx_event_type == NGX_KQUEUE_EVENT) -#endif - ev->available -= n; -#endif - - return n; -} diff --git a/src/event/ngx_event_recv.c b/src/event/ngx_event_recv.c new file mode 100644 index 000000000..75afcb854 --- /dev/null +++ b/src/event/ngx_event_recv.c @@ -0,0 +1,60 @@ + +#include +#include +#include +#include +#include + +int ngx_event_recv_core(ngx_event_t *ev, char *buf, size_t size) +{ + int n; + ngx_err_t err; + ngx_connection_t *c; + + c = (ngx_connection_t *) ev->data; + +#if (HAVE_KQUEUE) + ngx_log_debug(ev->log, "ngx_event_recv: eof:%d, avail:%d, err:%d" _ + ev->eof _ ev->available _ ev->error); +#if !(USE_KQUEUE) + if (ngx_event_type == NGX_KQUEUE_EVENT) +#endif + if (ev->eof && ev->available == 0) { + if (ev->error) { + ngx_log_error(NGX_LOG_ERR, ev->log, ev->error, + "ngx_event_recv: recv failed while %s", + ev->log->action); + + return -1; + } + + return 0; + } +#endif + + n = ngx_recv(c->fd, buf, size, 0); + + if (n == -1) { + err = ngx_socket_errno; + + if (err == NGX_EAGAIN) { + ngx_log_error(NGX_LOG_INFO, ev->log, err, + "ngx_event_recv: EAGAIN while %s", ev->log->action); + return -2; + } + + ngx_log_error(NGX_LOG_INFO, ev->log, err, + "ngx_event_recv: recv failed while %s", ev->log->action); + + return -1; + } + +#if (HAVE_KQUEUE) +#if !(USE_KQUEUE) + if (ngx_event_type == NGX_KQUEUE_EVENT) +#endif + ev->available -= n; +#endif + + return n; +} diff --git a/src/event/ngx_event_write.c b/src/event/ngx_event_write.c index 0a9a482d9..965a87c99 100644 --- a/src/event/ngx_event_write.c +++ b/src/event/ngx_event_write.c @@ -10,8 +10,8 @@ #include -ngx_chain_t *ngx_event_writer(ngx_connection_t *cn, ngx_chain_t *in, - off_t flush) +ngx_chain_t *ngx_event_write(ngx_connection_t *cn, ngx_chain_t *in, + off_t flush) { int rc; char *last; @@ -34,25 +34,21 @@ ngx_chain_t *ngx_event_writer(ngx_connection_t *cn, ngx_chain_t *in, header->nelts = 0; trailer->nelts = 0; - if (ch->hunk->type & (NGX_HUNK_IN_MEMORY | NGX_HUNK_FLUSH)) { + if (ch->hunk->type & NGX_HUNK_IN_MEMORY) { last = NULL; iov = NULL; - while (ch - && (ch->hunk->type & (NGX_HUNK_IN_MEMORY | NGX_HUNK_FLUSH))) + while (ch && (ch->hunk->type & NGX_HUNK_IN_MEMORY)) { - if (ch->hunk->type & NGX_HUNK_FLUSH) - continue; - - if (last == ch->hunk->pos.p) { - iov->ngx_iov_len += ch->hunk->last.p - ch->hunk->pos.p; + if (last == ch->hunk->pos.mem) { + iov->ngx_iov_len += ch->hunk->last.mem - ch->hunk->pos.mem; } else { ngx_test_null(iov, ngx_push_array(header), (ngx_chain_t *) -1); - iov->ngx_iov_base = ch->hunk->pos.p; - iov->ngx_iov_len = ch->hunk->last.p - ch->hunk->pos.p; - last = ch->hunk->last.p; + iov->ngx_iov_base = ch->hunk->pos.mem; + iov->ngx_iov_len = ch->hunk->last.mem - ch->hunk->pos.mem; + last = ch->hunk->last.mem; } ch = ch->next; @@ -70,25 +66,23 @@ ngx_chain_t *ngx_event_writer(ngx_connection_t *cn, ngx_chain_t *in, &sent); } else { #endif - if (ch && ch->hunk->type & (NGX_HUNK_IN_MEMORY | NGX_HUNK_FLUSH)) { + if (ch && ch->hunk->type & NGX_HUNK_IN_MEMORY) { last = NULL; iov = NULL; - while (ch - && (ch->hunk->type & (NGX_HUNK_IN_MEMORY | NGX_HUNK_FLUSH))) - { - if (ch->hunk->type & NGX_HUNK_FLUSH) - continue; + while (ch && (ch->hunk->type & NGX_HUNK_IN_MEMORY)) { - if (last == ch->hunk->pos.p) { - iov->ngx_iov_len += ch->hunk->last.p - ch->hunk->pos.p; + if (last == ch->hunk->pos.mem) { + iov->ngx_iov_len += + ch->hunk->last.mem - ch->hunk->pos.mem; } else { ngx_test_null(iov, ngx_push_array(trailer), (ngx_chain_t *) -1); - iov->ngx_iov_base = ch->hunk->pos.p; - iov->ngx_iov_len = ch->hunk->last.p - ch->hunk->pos.p; - last = ch->hunk->last.p; + iov->ngx_iov_base = ch->hunk->pos.mem; + iov->ngx_iov_len = + ch->hunk->last.mem - ch->hunk->pos.mem; + last = ch->hunk->last.mem; } ch = ch->next; @@ -98,8 +92,8 @@ ngx_chain_t *ngx_event_writer(ngx_connection_t *cn, ngx_chain_t *in, if (file) { rc = ngx_sendfile(cn->fd, (ngx_iovec_t *) header->elts, header->nelts, - file->fd, file->pos.f, - (size_t) (file->last.f - file->pos.f), + file->fd, file->pos.file, + (size_t) (file->last.file - file->pos.file), (ngx_iovec_t *) trailer->elts, trailer->nelts, &sent, cn->log); } else { @@ -117,17 +111,18 @@ ngx_chain_t *ngx_event_writer(ngx_connection_t *cn, ngx_chain_t *in, flush -= sent; for (ch = in; ch && !(ch->hunk->type & NGX_HUNK_LAST); ch = ch->next) { - if (sent >= ch->hunk->last.f - ch->hunk->pos.f) { - sent -= ch->hunk->last.f - ch->hunk->pos.f; - ch->hunk->last.f = ch->hunk->pos.f; + if (sent >= ch->hunk->last.file - ch->hunk->pos.file) { + sent -= ch->hunk->last.file - ch->hunk->pos.file; + ch->hunk->last.file = ch->hunk->pos.file; continue; } - ch->hunk->pos.f += sent; + ch->hunk->pos.file += sent; break; } - } while (flush > 0); + /* flush hunks if threaded state */ + } while (cn->write->context && flush > 0); ngx_destroy_array(trailer); ngx_destroy_array(header); -- cgit