nginx-0.0.1-2003-11-27-22:01:37 import

This commit is contained in:
Igor Sysoev 2003-11-27 19:01:37 +00:00
parent 0e499db3ed
commit 764543e734
9 changed files with 94 additions and 61 deletions

View File

@ -9,7 +9,7 @@ echo "$NGX_UNISTD_H" > autotest.c
echo "$NGX_FUNC_INC" >> autotest.c echo "$NGX_FUNC_INC" >> autotest.c
echo "int main() { $NGX_FUNC_TEST; return 0; }" >> autotest.c echo "int main() { $NGX_FUNC_TEST; return 0; }" >> autotest.c
eval "$CC $CC_TEST_FLAGS -o autotest autotest.c > $NGX_ERR 2>&1" eval "$CC $CC_TEST_FLAGS -o autotest autotest.c $NGX_FUNC_LIBS > $NGX_ERR 2>&1"
if [ -x autotest ]; then if [ -x autotest ]; then
echo " + $NGX_FUNC found" echo " + $NGX_FUNC found"

View File

@ -9,8 +9,7 @@ ZLIB_LIB="-lz"
# TODO check sendfile64() # TODO check sendfile64()
#CC_TEST_FLAGS="-D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE" CC_TEST_FLAGS="-D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE"
CC_TEST_FLAGS="-D_GNU_SOURCE"
# STUB # STUB
CORE_SRCS="$CORE_SRCS $LINUX_SENDFILE_SRCS" CORE_SRCS="$CORE_SRCS $LINUX_SENDFILE_SRCS"

View File

@ -22,6 +22,7 @@ fi
NGX_FUNC_INC="#include <sys/sendfile.h>" NGX_FUNC_INC="#include <sys/sendfile.h>"
NGX_FUNC_LIBS="-lsendfile"
NGX_FUNC_TEST="int fd = 1; sendfilevec_t vec[1]; NGX_FUNC_TEST="int fd = 1; sendfilevec_t vec[1];
size_t sent = 1; ssize_t n; size_t sent = 1; ssize_t n;
n = sendfilev(fd, vec, 1, &sent)" n = sendfilev(fd, vec, 1, &sent)"

View File

@ -4,10 +4,8 @@
#define _GNU_SOURCE /* pread(), pwrite(), gethostname() */ #define _GNU_SOURCE /* pread(), pwrite(), gethostname() */
#if 0
#define _FILE_OFFSET_BITS 64 #define _FILE_OFFSET_BITS 64
#define _LARGEFILE_SOURCE #define _LARGEFILE_SOURCE
#endif
#include <unistd.h> #include <unistd.h>
@ -28,7 +26,13 @@
#include <sys/sysctl.h> #include <sys/sysctl.h>
#include <sys/wait.h> #include <sys/wait.h>
#include <sys/socket.h> #include <sys/socket.h>
#if (HAVE_SENDFILE64)
#include <sys/sendfile.h> #include <sys/sendfile.h>
#else
extern ssize_t sendfile(int s, int fd, int32_t *offset, size_t size);
#endif
#include <netinet/in.h> #include <netinet/in.h>
#include <netinet/tcp.h> /* TCP_CORK */ #include <netinet/tcp.h> /* TCP_CORK */
#include <arpa/inet.h> #include <arpa/inet.h>
@ -37,15 +41,6 @@
#if 0
#define SIZE_FMT "%d"
#define SIZEX_FMT "%x"
#define PID_FMT "%d"
#define RLIM_FMT "%lu"
#endif
#ifndef HAVE_SELECT #ifndef HAVE_SELECT
#define HAVE_SELECT 1 #define HAVE_SELECT 1
#endif #endif

View File

@ -8,7 +8,7 @@ ngx_chain_t *ngx_linux_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in)
{ {
int rc; int rc;
char *prev; char *prev;
off_t offset; off_t fprev;
size_t size, fsize, sent; size_t size, fsize, sent;
ngx_int_t use_cork, eintr; ngx_int_t use_cork, eintr;
struct iovec *iov; struct iovec *iov;
@ -17,6 +17,11 @@ ngx_chain_t *ngx_linux_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in)
ngx_array_t header; ngx_array_t header;
ngx_event_t *wev; ngx_event_t *wev;
ngx_chain_t *cl, *tail; ngx_chain_t *cl, *tail;
#if (HAVE_SENDFILE64)
off_t offset;
#else
int32_t offset;
#endif
wev = c->write; wev = c->write;
@ -82,20 +87,20 @@ ngx_log_debug(c->log, "CORK");
file = cl->hunk; file = cl->hunk;
fsize = (size_t) (file->file_last - file->file_pos); fsize = (size_t) (file->file_last - file->file_pos);
offset = file->file_last; fprev = file->file_last;
cl = cl->next; cl = cl->next;
/* coalesce the neighbouring file hunks */ /* coalesce the neighbouring file hunks */
while (cl && (cl->hunk->type & NGX_HUNK_FILE)) { while (cl && (cl->hunk->type & NGX_HUNK_FILE)) {
if (file->file->fd != cl->hunk->file->fd if (file->file->fd != cl->hunk->file->fd
|| offset != cl->hunk->file_pos) || fprev != cl->hunk->file_pos)
{ {
break; break;
} }
fsize += (size_t) (cl->hunk->file_last - cl->hunk->file_pos); fsize += (size_t) (cl->hunk->file_last - cl->hunk->file_pos);
offset = cl->hunk->file_last; fprev = cl->hunk->file_last;
cl = cl->next; cl = cl->next;
} }
} }
@ -108,7 +113,11 @@ ngx_log_debug(c->log, "CORK");
tail = cl; tail = cl;
if (fsize) { if (fsize) {
#if (HAVE_SENDFILE64)
offset = file->file_pos; offset = file->file_pos;
#else
offset = (int32_t) file->file_pos;
#endif
rc = sendfile(c->fd, file->file->fd, &offset, fsize); rc = sendfile(c->fd, file->file->fd, &offset, fsize);
if (rc == -1) { if (rc == -1) {

View File

@ -62,4 +62,9 @@ extern int rotate;
#endif #endif
#ifdef SOLARIS
#include <ngx_solaris.h>
#endif
#endif /* _NGX_OS_H_INCLUDED_ */ #endif /* _NGX_OS_H_INCLUDED_ */

View File

@ -12,8 +12,13 @@ ngx_os_io_t ngx_os_io = {
ngx_unix_recv, ngx_unix_recv,
NULL, NULL,
NULL, NULL,
#if (HAVE_SENDFILE)
ngx_solaris_sendfilev_chain,
NGX_IO_SENDFILE
#else
ngx_writev_chain, ngx_writev_chain,
0 0
#endif
}; };

View File

@ -9,9 +9,10 @@ ngx_chain_t *ngx_solaris_sendfilev_chain(ngx_connection_t *c, ngx_chain_t *in)
int fd; int fd;
char *prev; char *prev;
off_t fprev; off_t fprev;
size_t sent; size_t sent, size;
ssize_t n; ssize_t n;
ngx_int_t eintr; ngx_int_t eintr;
ngx_err_t err;
sendfilevec_t *sfv; sendfilevec_t *sfv;
ngx_array_t vec; ngx_array_t vec;
ngx_event_t *wev; ngx_event_t *wev;
@ -26,10 +27,14 @@ ngx_chain_t *ngx_solaris_sendfilev_chain(ngx_connection_t *c, ngx_chain_t *in)
do { do {
fd = SFV_FD_SELF; fd = SFV_FD_SELF;
prev = NULL; prev = NULL;
fprev = 0;
sfv = NULL; sfv = NULL;
eintr = 0; eintr = 0;
sent = 0; sent = 0;
ngx_init_array(vec, c->pool, 10, sizeof(sendfilevec_t),
NGX_CHAIN_ERROR);
/* create the sendfilevec and coalesce the neighbouring hunks */ /* create the sendfilevec and coalesce the neighbouring hunks */
for (cl = in; cl; cl = cl->next) { for (cl = in; cl; cl = cl->next) {
@ -47,7 +52,7 @@ ngx_chain_t *ngx_solaris_sendfilev_chain(ngx_connection_t *c, ngx_chain_t *in)
ngx_test_null(sfv, ngx_push_array(&vec), NGX_CHAIN_ERROR); ngx_test_null(sfv, ngx_push_array(&vec), NGX_CHAIN_ERROR);
sfv->sfv_fd = SFV_FD_SELF; sfv->sfv_fd = SFV_FD_SELF;
sfv->sfv_flag = 0; sfv->sfv_flag = 0;
sfv->sfv_off = cl->hunk->pos; sfv->sfv_off = (off_t) (uintptr_t) cl->hunk->pos;
sfv->sfv_len = cl->hunk->last - cl->hunk->pos; sfv->sfv_len = cl->hunk->last - cl->hunk->pos;
} }
@ -72,7 +77,7 @@ ngx_chain_t *ngx_solaris_sendfilev_chain(ngx_connection_t *c, ngx_chain_t *in)
} }
} }
n = sendfile(c->fd, vec->elts, vec->nelts, &sent); n = sendfilev(c->fd, vec.elts, vec.nelts, &sent);
if (n == -1) { if (n == -1) {
err = ngx_errno; err = ngx_errno;
@ -93,7 +98,7 @@ ngx_chain_t *ngx_solaris_sendfilev_chain(ngx_connection_t *c, ngx_chain_t *in)
} }
#if (NGX_DEBUG_WRITE_CHAIN) #if (NGX_DEBUG_WRITE_CHAIN)
ngx_log_debug(c->log, "sendfilev: %d " SIZE_T_FMT ", n _ sent); ngx_log_debug(c->log, "sendfilev: %d " SIZE_T_FMT _ n _ sent);
#endif #endif
c->sent += sent; c->sent += sent;

View File

@ -10,80 +10,94 @@ ngx_chain_t *ngx_writev_chain(ngx_connection_t *c, ngx_chain_t *in)
ssize_t n, size; ssize_t n, size;
off_t sent; off_t sent;
struct iovec *iov; struct iovec *iov;
ngx_int_t eintr;
ngx_err_t err; ngx_err_t err;
ngx_array_t io; ngx_array_t io;
ngx_chain_t *cl; ngx_chain_t *cl;
ngx_event_t *wev;
if (!c->write->ready) { wev = c->write;
if (!wev->ready) {
return in; return in;
} }
ngx_init_array(io, c->pool, 10, sizeof(struct iovec), NGX_CHAIN_ERROR); ngx_init_array(io, c->pool, 10, sizeof(struct iovec), NGX_CHAIN_ERROR);
prev = NULL; do {
iov = NULL; prev = NULL;
iov = NULL;
eintr = 0;
/* create the iovec and coalesce the neighbouring hunks */ /* create the iovec and coalesce the neighbouring hunks */
for (cl = in; cl; cl = cl->next) { for (cl = in; cl; cl = cl->next) {
if (prev == cl->hunk->pos) { if (prev == cl->hunk->pos) {
iov->iov_len += cl->hunk->last - cl->hunk->pos; iov->iov_len += cl->hunk->last - cl->hunk->pos;
prev = cl->hunk->last; prev = cl->hunk->last;
} else { } else {
ngx_test_null(iov, ngx_push_array(&io), NGX_CHAIN_ERROR); ngx_test_null(iov, ngx_push_array(&io), NGX_CHAIN_ERROR);
iov->iov_base = cl->hunk->pos; iov->iov_base = cl->hunk->pos;
iov->iov_len = cl->hunk->last - cl->hunk->pos; iov->iov_len = cl->hunk->last - cl->hunk->pos;
prev = cl->hunk->last; prev = cl->hunk->last;
}
} }
}
n = writev(c->fd, io.elts, io.nelts); n = writev(c->fd, io.elts, io.nelts);
if (n == -1) { if (n == -1) {
err = ngx_errno; err = ngx_errno;
if (err == NGX_EAGAIN) { if (err == NGX_EAGAIN) {
ngx_log_error(NGX_LOG_INFO, c->log, err, "writev() EAGAIN"); ngx_log_error(NGX_LOG_INFO, c->log, err, "writev() EAGAIN");
} else if (err == NGX_EINTR) { } else if (err == NGX_EINTR) {
ngx_log_error(NGX_LOG_INFO, c->log, err, "writev() EINTR"); eintr = 1;
ngx_log_error(NGX_LOG_INFO, c->log, err, "writev() EINTR");
} else { } else {
ngx_log_error(NGX_LOG_CRIT, c->log, err, "writev() failed"); wev->error = 1;
return NGX_CHAIN_ERROR; ngx_log_error(NGX_LOG_CRIT, c->log, err, "writev() failed");
return NGX_CHAIN_ERROR;
}
} }
}
sent = n > 0 ? n : 0; sent = n > 0 ? n : 0;
#if (NGX_DEBUG_WRITE_CHAIN) #if (NGX_DEBUG_WRITE_CHAIN)
ngx_log_debug(c->log, "writev: " OFF_T_FMT _ sent); ngx_log_debug(c->log, "writev: " OFF_T_FMT _ sent);
#endif #endif
c->sent += sent; c->sent += sent;
for (cl = in; cl && sent > 0; cl = cl->next) { for (cl = in; cl && sent > 0; cl = cl->next) {
size = cl->hunk->last - cl->hunk->pos; size = cl->hunk->last - cl->hunk->pos;
ngx_log_debug(c->log, "SIZE: %d" _ size); ngx_log_debug(c->log, "SIZE: %d" _ size);
if (sent >= size) { if (sent >= size) {
sent -= size; sent -= size;
if (cl->hunk->type & NGX_HUNK_IN_MEMORY) { if (cl->hunk->type & NGX_HUNK_IN_MEMORY) {
cl->hunk->pos = cl->hunk->last; cl->hunk->pos = cl->hunk->last;
}
continue;
} }
continue; if (cl->hunk->type & NGX_HUNK_IN_MEMORY) {
cl->hunk->pos += sent;
}
break;
} }
if (cl->hunk->type & NGX_HUNK_IN_MEMORY) { } while (eintr);
cl->hunk->pos += sent;
}
break; if (cl) {
wev->ready = 0;
} }
return cl; return cl;