# HG changeset patch # User Igor Sysoev # Date 1077119121 0 # Node ID 8c5bdde0d9f0ffda8aff29e854839021cc67f52c # Parent bdd631bf1a1c7ebf984347c8fe41b6c3a029d7cf nginx-0.0.2-2004-02-18-18:45:21 import diff --git a/auto/cc b/auto/cc --- a/auto/cc +++ b/auto/cc @@ -24,7 +24,7 @@ case $CC in # debug CFLAGS="$CFLAGS -g" - CFLAGS="$CFLAGS -D HAVE_GCC_VARIADIC_MACROS=1" + have=HAVE_GCC_VARIADIC_MACROS . auto/have OBJEXT=o OBJOUT="-o " @@ -50,7 +50,7 @@ case $CC in # stop on warning CFLAGS="$CFLAGS -Werror" - CFLAGS="$CFLAGS -D HAVE_C99_VARIADIC_MACROS=1" + have=HAVE_C99_VARIADIC_MACROS . auto/have OBJEXT=o OBJOUT="-o " diff --git a/src/event/modules/ngx_rtsig_module.c b/src/event/modules/ngx_rtsig_module.c --- a/src/event/modules/ngx_rtsig_module.c +++ b/src/event/modules/ngx_rtsig_module.c @@ -40,7 +40,7 @@ static void ngx_rtsig_done(ngx_cycle_t * static int ngx_rtsig_add_connection(ngx_connection_t *c); static int ngx_rtsig_del_connection(ngx_connection_t *c, u_int flags); static int ngx_rtsig_process_events(ngx_log_t *log); -static int ngx_rtsig_process_overlow(ngx_log_t *log); +static int ngx_rtsig_process_overflow(ngx_log_t *log); static void *ngx_rtsig_create_conf(ngx_cycle_t *cycle); static char *ngx_rtsig_init_conf(ngx_cycle_t *cycle, void *conf); @@ -310,7 +310,7 @@ int ngx_rtsig_process_events(ngx_log_t * } -static int ngx_rtsig_process_overlow(ngx_log_t *log) +static int ngx_rtsig_process_overflow(ngx_log_t *log) { if (ngx_poll_module_ctx.actions.process(log) == NGX_OK) { ngx_event_actions = ngx_rtsig_module_ctx.actions; diff --git a/src/event/ngx_event.h b/src/event/ngx_event.h --- a/src/event/ngx_event.h +++ b/src/event/ngx_event.h @@ -287,6 +287,7 @@ extern ngx_event_actions_t ngx_event_a #define NGX_WRITE_EVENT POLLOUT #define NGX_LEVEL_EVENT 0 +#define NGX_ONESHOT_EVENT 1 #elif (HAVE_EPOLL) diff --git a/src/os/unix/ngx_freebsd_config.h b/src/os/unix/ngx_freebsd_config.h --- a/src/os/unix/ngx_freebsd_config.h +++ b/src/os/unix/ngx_freebsd_config.h @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -71,6 +72,11 @@ #endif +#ifndef IOV_MAX +#define IOV_MAX 1024 +#endif + + #ifndef HAVE_INHERITED_NONBLOCK #define HAVE_INHERITED_NONBLOCK 1 #endif diff --git a/src/os/unix/ngx_freebsd_sendfile_chain.c b/src/os/unix/ngx_freebsd_sendfile_chain.c --- a/src/os/unix/ngx_freebsd_sendfile_chain.c +++ b/src/os/unix/ngx_freebsd_sendfile_chain.c @@ -73,7 +73,7 @@ ngx_chain_t *ngx_freebsd_sendfile_chain( prev = NULL; iov = NULL; - for (cl = in; cl; cl = cl->next) { + for (cl = in; cl && header.nelts < IOV_MAX; cl = cl->next) { if (ngx_hunk_special(cl->hunk)) { continue; } @@ -123,7 +123,7 @@ ngx_chain_t *ngx_freebsd_sendfile_chain( prev = NULL; iov = NULL; - for ( /* void */; cl; cl = cl->next) { + for ( /* void */; cl && trailer.nelts < IOV_MAX; cl = cl->next) { if (ngx_hunk_special(cl->hunk)) { continue; } diff --git a/src/os/unix/ngx_linux_config.h b/src/os/unix/ngx_linux_config.h --- a/src/os/unix/ngx_linux_config.h +++ b/src/os/unix/ngx_linux_config.h @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include diff --git a/src/os/unix/ngx_linux_sendfile_chain.c b/src/os/unix/ngx_linux_sendfile_chain.c --- a/src/os/unix/ngx_linux_sendfile_chain.c +++ b/src/os/unix/ngx_linux_sendfile_chain.c @@ -52,7 +52,7 @@ ngx_chain_t *ngx_linux_sendfile_chain(ng /* create the iovec and coalesce the neighbouring hunks */ - for (cl = in; cl; cl = cl->next) { + for (cl = in; cl && header.nelts < IOV_MAX; cl = cl->next) { if (ngx_hunk_special(cl->hunk)) { continue; } diff --git a/src/os/unix/ngx_solaris_config.h b/src/os/unix/ngx_solaris_config.h --- a/src/os/unix/ngx_solaris_config.h +++ b/src/os/unix/ngx_solaris_config.h @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include diff --git a/src/os/unix/ngx_solaris_sendfilev_chain.c b/src/os/unix/ngx_solaris_sendfilev_chain.c --- a/src/os/unix/ngx_solaris_sendfilev_chain.c +++ b/src/os/unix/ngx_solaris_sendfilev_chain.c @@ -16,7 +16,7 @@ ngx_chain_t *ngx_solaris_sendfilev_chain sendfilevec_t *sfv; ngx_array_t vec; ngx_event_t *wev; - ngx_chain_t *cl; + ngx_chain_t *cl, *tail; wev = c->write; @@ -37,7 +37,7 @@ ngx_chain_t *ngx_solaris_sendfilev_chain /* create the sendfilevec and coalesce the neighbouring hunks */ - for (cl = in; cl; cl = cl->next) { + for (cl = in; cl && vec.nelts < IOV_MAX; cl = cl->next) { if (ngx_hunk_special(cl->hunk)) { continue; } @@ -77,6 +77,13 @@ ngx_chain_t *ngx_solaris_sendfilev_chain } } + /* + * the tail is the rest of the chain that exceeded a single + * sendfilev() capability, IOV_MAX in Solaris is only 16 + */ + + tail = cl; + n = sendfilev(c->fd, vec.elts, vec.nelts, &sent); if (n == -1) { @@ -142,7 +149,9 @@ ngx_chain_t *ngx_solaris_sendfilev_chain in = cl; - } while (eintr); + /* "tail == in" means that a single sendfilev() is complete */ + + } while ((tail && tail == in) || eintr); if (in) { wev->ready = 0;