diff options
| author | Igor Sysoev <igor@sysoev.ru> | 2002-08-15 17:20:26 +0000 |
|---|---|---|
| committer | Igor Sysoev <igor@sysoev.ru> | 2002-08-15 17:20:26 +0000 |
| commit | 0c331d9f666b4f9be91009b7caea457e58a80779 (patch) | |
| tree | d48221581b361ee5b0ccad46e4df49caa41b1bba /src/event | |
| parent | 6de5c2cb63f8aee4bcbec3c363a72fd8e4a4e64d (diff) | |
| download | nginx-0c331d9f666b4f9be91009b7caea457e58a80779.tar.gz nginx-0c331d9f666b4f9be91009b7caea457e58a80779.tar.bz2 | |
nginx-0.0.1-2002-08-15-21:20:26 import
Diffstat (limited to 'src/event')
| -rw-r--r-- | src/event/modules/ngx_overlapped_module.c | 34 | ||||
| -rw-r--r-- | src/event/ngx_event.h | 22 | ||||
| -rw-r--r-- | src/event/ngx_event_mutex.c | 14 | ||||
| -rw-r--r-- | src/event/ngx_event_recv.c (renamed from src/event/ngx_event_read.c) | 19 | ||||
| -rw-r--r-- | src/event/ngx_event_write.c | 57 |
5 files changed, 99 insertions, 47 deletions
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_recv.c index b08e5107e..75afcb854 100644 --- a/src/event/ngx_event_read.c +++ b/src/event/ngx_event_recv.c @@ -2,23 +2,28 @@ #include <ngx_config.h> #include <ngx_errno.h> #include <ngx_log.h> +#include <ngx_recv.h> #include <ngx_connection.h> -int ngx_event_recv(ngx_connection_t *c, char *buf, size_t size) +int ngx_event_recv_core(ngx_event_t *ev, char *buf, size_t size) { - int n; - ngx_err_t err; - ngx_event_t *ev = c->read; + 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); + "ngx_event_recv: recv failed while %s", + ev->log->action); return -1; } @@ -27,7 +32,7 @@ int ngx_event_recv(ngx_connection_t *c, char *buf, size_t size) } #endif - n = recv(c->fd, buf, size, 0); + n = ngx_recv(c->fd, buf, size, 0); if (n == -1) { err = ngx_socket_errno; 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_event_write.h> -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); |
