aboutsummaryrefslogtreecommitdiff
path: root/src/os/unix
diff options
context:
space:
mode:
Diffstat (limited to 'src/os/unix')
-rw-r--r--src/os/unix/ngx_darwin_sendfile_chain.c27
-rw-r--r--src/os/unix/ngx_freebsd_sendfile_chain.c27
-rw-r--r--src/os/unix/ngx_linux_sendfile_chain.c27
3 files changed, 9 insertions, 72 deletions
diff --git a/src/os/unix/ngx_darwin_sendfile_chain.c b/src/os/unix/ngx_darwin_sendfile_chain.c
index d98fd74b0..a85269dcd 100644
--- a/src/os/unix/ngx_darwin_sendfile_chain.c
+++ b/src/os/unix/ngx_darwin_sendfile_chain.c
@@ -31,7 +31,7 @@ ngx_chain_t *
ngx_darwin_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)
{
int rc;
- off_t size, send, prev_send, aligned, sent, fprev;
+ off_t send, prev_send, sent;
off_t file_size;
ngx_uint_t eintr;
ngx_err_t err;
@@ -95,30 +95,9 @@ ngx_darwin_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)
/* coalesce the neighbouring file bufs */
- do {
- size = cl->buf->file_last - cl->buf->file_pos;
+ file_size = ngx_chain_coalesce_file(&cl, limit - send);
- if (send + size > limit) {
- size = limit - send;
-
- aligned = (cl->buf->file_pos + size + ngx_pagesize - 1)
- & ~((off_t) ngx_pagesize - 1);
-
- if (aligned <= cl->buf->file_last) {
- size = aligned - cl->buf->file_pos;
- }
- }
-
- file_size += size;
- send += size;
- fprev = cl->buf->file_pos + size;
- cl = cl->next;
-
- } while (cl
- && cl->buf->in_file
- && send < limit
- && file->file->fd == cl->buf->file->fd
- && fprev == cl->buf->file_pos);
+ send += file_size;
}
if (file && header.count == 0) {
diff --git a/src/os/unix/ngx_freebsd_sendfile_chain.c b/src/os/unix/ngx_freebsd_sendfile_chain.c
index 83e0f680c..96d783e27 100644
--- a/src/os/unix/ngx_freebsd_sendfile_chain.c
+++ b/src/os/unix/ngx_freebsd_sendfile_chain.c
@@ -33,7 +33,7 @@ ngx_chain_t *
ngx_freebsd_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)
{
int rc, flags;
- off_t size, send, prev_send, aligned, sent, fprev;
+ off_t send, prev_send, sent;
size_t file_size;
ngx_uint_t eintr, eagain;
ngx_err_t err;
@@ -99,30 +99,9 @@ ngx_freebsd_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)
/* coalesce the neighbouring file bufs */
- do {
- size = cl->buf->file_last - cl->buf->file_pos;
+ file_size = (size_t) ngx_chain_coalesce_file(&cl, limit - send);
- if (send + size > limit) {
- size = limit - send;
-
- aligned = (cl->buf->file_pos + size + ngx_pagesize - 1)
- & ~((off_t) ngx_pagesize - 1);
-
- if (aligned <= cl->buf->file_last) {
- size = aligned - cl->buf->file_pos;
- }
- }
-
- file_size += (size_t) size;
- send += size;
- fprev = cl->buf->file_pos + size;
- cl = cl->next;
-
- } while (cl
- && cl->buf->in_file
- && send < limit
- && file->file->fd == cl->buf->file->fd
- && fprev == cl->buf->file_pos);
+ send += file_size;
}
diff --git a/src/os/unix/ngx_linux_sendfile_chain.c b/src/os/unix/ngx_linux_sendfile_chain.c
index a84a1346f..417c19b02 100644
--- a/src/os/unix/ngx_linux_sendfile_chain.c
+++ b/src/os/unix/ngx_linux_sendfile_chain.c
@@ -31,7 +31,7 @@ ngx_chain_t *
ngx_linux_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)
{
int rc, tcp_nodelay;
- off_t size, send, prev_send, aligned, sent, fprev;
+ off_t send, prev_send, sent;
size_t file_size;
ngx_err_t err;
ngx_buf_t *file;
@@ -153,30 +153,9 @@ ngx_linux_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)
/* coalesce the neighbouring file bufs */
- do {
- size = cl->buf->file_last - cl->buf->file_pos;
+ file_size = (size_t) ngx_chain_coalesce_file(&cl, limit - send);
- if (send + size > limit) {
- size = limit - send;
-
- aligned = (cl->buf->file_pos + size + ngx_pagesize - 1)
- & ~((off_t) ngx_pagesize - 1);
-
- if (aligned <= cl->buf->file_last) {
- size = aligned - cl->buf->file_pos;
- }
- }
-
- file_size += (size_t) size;
- send += size;
- fprev = cl->buf->file_pos + size;
- cl = cl->next;
-
- } while (cl
- && cl->buf->in_file
- && send < limit
- && file->file->fd == cl->buf->file->fd
- && fprev == cl->buf->file_pos);
+ send += file_size;
}
if (file) {