aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/ngx_buf.c46
-rw-r--r--src/core/ngx_buf.h1
-rw-r--r--src/os/unix/ngx_darwin_sendfile_chain.c37
-rw-r--r--src/os/unix/ngx_freebsd_sendfile_chain.c37
-rw-r--r--src/os/unix/ngx_linux_sendfile_chain.c37
-rw-r--r--src/os/unix/ngx_solaris_sendfilev_chain.c37
-rw-r--r--src/os/unix/ngx_writev_chain.c24
-rw-r--r--src/os/win32/ngx_wsasend_chain.c47
8 files changed, 54 insertions, 212 deletions
diff --git a/src/core/ngx_buf.c b/src/core/ngx_buf.c
index 835c76ced..94a3d3f10 100644
--- a/src/core/ngx_buf.c
+++ b/src/core/ngx_buf.c
@@ -218,3 +218,49 @@ ngx_chain_update_chains(ngx_pool_t *p, ngx_chain_t **free, ngx_chain_t **busy,
*free = cl;
}
}
+
+
+ngx_chain_t *
+ngx_handle_sent_chain(ngx_chain_t *in, off_t sent)
+{
+ off_t size;
+
+ for ( /* void */ ; in; in = in->next) {
+
+ if (ngx_buf_special(in->buf)) {
+ continue;
+ }
+
+ if (sent == 0) {
+ break;
+ }
+
+ size = ngx_buf_size(in->buf);
+
+ if (sent >= size) {
+ sent -= size;
+
+ if (ngx_buf_in_memory(in->buf)) {
+ in->buf->pos = in->buf->last;
+ }
+
+ if (in->buf->in_file) {
+ in->buf->file_pos = in->buf->file_last;
+ }
+
+ continue;
+ }
+
+ if (ngx_buf_in_memory(in->buf)) {
+ in->buf->pos += (size_t) sent;
+ }
+
+ if (in->buf->in_file) {
+ in->buf->file_pos += sent;
+ }
+
+ break;
+ }
+
+ return in;
+}
diff --git a/src/core/ngx_buf.h b/src/core/ngx_buf.h
index ffc531094..cc28a3e15 100644
--- a/src/core/ngx_buf.h
+++ b/src/core/ngx_buf.h
@@ -158,5 +158,6 @@ ngx_chain_t *ngx_chain_get_free_buf(ngx_pool_t *p, ngx_chain_t **free);
void ngx_chain_update_chains(ngx_pool_t *p, ngx_chain_t **free,
ngx_chain_t **busy, ngx_chain_t **out, ngx_buf_tag_t tag);
+ngx_chain_t *ngx_handle_sent_chain(ngx_chain_t *in, off_t sent);
#endif /* _NGX_BUF_H_INCLUDED_ */
diff --git a/src/os/unix/ngx_darwin_sendfile_chain.c b/src/os/unix/ngx_darwin_sendfile_chain.c
index 068add959..b82800e78 100644
--- a/src/os/unix/ngx_darwin_sendfile_chain.c
+++ b/src/os/unix/ngx_darwin_sendfile_chain.c
@@ -317,42 +317,7 @@ ngx_darwin_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)
c->sent += sent;
- for ( /* void */ ; in; in = in->next) {
-
- if (ngx_buf_special(in->buf)) {
- continue;
- }
-
- if (sent == 0) {
- break;
- }
-
- size = ngx_buf_size(in->buf);
-
- if (sent >= size) {
- sent -= size;
-
- if (ngx_buf_in_memory(in->buf)) {
- in->buf->pos = in->buf->last;
- }
-
- if (in->buf->in_file) {
- in->buf->file_pos = in->buf->file_last;
- }
-
- continue;
- }
-
- if (ngx_buf_in_memory(in->buf)) {
- in->buf->pos += (size_t) sent;
- }
-
- if (in->buf->in_file) {
- in->buf->file_pos += sent;
- }
-
- break;
- }
+ in = ngx_handle_sent_chain(in, sent);
if (eintr) {
continue;
diff --git a/src/os/unix/ngx_freebsd_sendfile_chain.c b/src/os/unix/ngx_freebsd_sendfile_chain.c
index 6491e928f..0abbdb349 100644
--- a/src/os/unix/ngx_freebsd_sendfile_chain.c
+++ b/src/os/unix/ngx_freebsd_sendfile_chain.c
@@ -368,42 +368,7 @@ ngx_freebsd_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)
c->sent += sent;
- for ( /* void */ ; in; in = in->next) {
-
- if (ngx_buf_special(in->buf)) {
- continue;
- }
-
- if (sent == 0) {
- break;
- }
-
- size = ngx_buf_size(in->buf);
-
- if (sent >= size) {
- sent -= size;
-
- if (ngx_buf_in_memory(in->buf)) {
- in->buf->pos = in->buf->last;
- }
-
- if (in->buf->in_file) {
- in->buf->file_pos = in->buf->file_last;
- }
-
- continue;
- }
-
- if (ngx_buf_in_memory(in->buf)) {
- in->buf->pos += (size_t) sent;
- }
-
- if (in->buf->in_file) {
- in->buf->file_pos += sent;
- }
-
- break;
- }
+ in = ngx_handle_sent_chain(in, sent);
#if (NGX_HAVE_AIO_SENDFILE)
if (c->busy_sendfile) {
diff --git a/src/os/unix/ngx_linux_sendfile_chain.c b/src/os/unix/ngx_linux_sendfile_chain.c
index 16395f943..3e6fc6dd8 100644
--- a/src/os/unix/ngx_linux_sendfile_chain.c
+++ b/src/os/unix/ngx_linux_sendfile_chain.c
@@ -325,42 +325,7 @@ ngx_linux_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)
c->sent += sent;
- for ( /* void */ ; in; in = in->next) {
-
- if (ngx_buf_special(in->buf)) {
- continue;
- }
-
- if (sent == 0) {
- break;
- }
-
- size = ngx_buf_size(in->buf);
-
- if (sent >= size) {
- sent -= size;
-
- if (ngx_buf_in_memory(in->buf)) {
- in->buf->pos = in->buf->last;
- }
-
- if (in->buf->in_file) {
- in->buf->file_pos = in->buf->file_last;
- }
-
- continue;
- }
-
- if (ngx_buf_in_memory(in->buf)) {
- in->buf->pos += (size_t) sent;
- }
-
- if (in->buf->in_file) {
- in->buf->file_pos += sent;
- }
-
- break;
- }
+ in = ngx_handle_sent_chain(in, sent);
if (eintr) {
continue;
diff --git a/src/os/unix/ngx_solaris_sendfilev_chain.c b/src/os/unix/ngx_solaris_sendfilev_chain.c
index 37bb09d96..76e8728e4 100644
--- a/src/os/unix/ngx_solaris_sendfilev_chain.c
+++ b/src/os/unix/ngx_solaris_sendfilev_chain.c
@@ -207,42 +207,7 @@ ngx_solaris_sendfilev_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)
c->sent += sent;
- for ( /* void */ ; in; in = in->next) {
-
- if (ngx_buf_special(in->buf)) {
- continue;
- }
-
- if (sent == 0) {
- break;
- }
-
- size = ngx_buf_size(in->buf);
-
- if ((off_t) sent >= size) {
- sent = (size_t) ((off_t) sent - size);
-
- if (ngx_buf_in_memory(in->buf)) {
- in->buf->pos = in->buf->last;
- }
-
- if (in->buf->in_file) {
- in->buf->file_pos = in->buf->file_last;
- }
-
- continue;
- }
-
- if (ngx_buf_in_memory(in->buf)) {
- in->buf->pos += sent;
- }
-
- if (in->buf->in_file) {
- in->buf->file_pos += sent;
- }
-
- break;
- }
+ in = ngx_handle_sent_chain(in, sent);
if (eintr) {
continue;
diff --git a/src/os/unix/ngx_writev_chain.c b/src/os/unix/ngx_writev_chain.c
index 805982d65..ff16f86e3 100644
--- a/src/os/unix/ngx_writev_chain.c
+++ b/src/os/unix/ngx_writev_chain.c
@@ -143,29 +143,7 @@ ngx_writev_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)
c->sent += sent;
- for (cl = in; cl; cl = cl->next) {
-
- if (ngx_buf_special(cl->buf)) {
- continue;
- }
-
- if (sent == 0) {
- break;
- }
-
- size = cl->buf->last - cl->buf->pos;
-
- if (sent >= size) {
- sent -= size;
- cl->buf->pos = cl->buf->last;
-
- continue;
- }
-
- cl->buf->pos += sent;
-
- break;
- }
+ cl = ngx_handle_sent_chain(in, sent);
if (eintr) {
continue;
diff --git a/src/os/win32/ngx_wsasend_chain.c b/src/os/win32/ngx_wsasend_chain.c
index fa7377607..a818fe1f9 100644
--- a/src/os/win32/ngx_wsasend_chain.c
+++ b/src/os/win32/ngx_wsasend_chain.c
@@ -119,29 +119,7 @@ ngx_wsasend_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)
c->sent += sent;
- for (cl = in; cl; cl = cl->next) {
-
- if (ngx_buf_special(cl->buf)) {
- continue;
- }
-
- if (sent == 0) {
- break;
- }
-
- size = cl->buf->last - cl->buf->pos;
-
- if (sent >= size) {
- sent -= size;
- cl->buf->pos = cl->buf->last;
-
- continue;
- }
-
- cl->buf->pos += sent;
-
- break;
- }
+ cl = ngx_handle_sent_chain(in, sent);
if (!complete) {
wev->ready = 0;
@@ -308,28 +286,7 @@ ngx_overlapped_wsasend_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)
c->sent += sent;
- for (cl = in; cl && sent > 0; cl = cl->next) {
- if (ngx_buf_special(cl->buf)) {
- continue;
- }
-
- if (sent == 0) {
- break;
- }
-
- size = cl->buf->last - cl->buf->pos;
-
- if (sent >= size) {
- sent -= size;
- cl->buf->pos = cl->buf->last;
-
- continue;
- }
-
- cl->buf->pos += sent;
-
- break;
- }
+ cl = ngx_handle_sent_chain(in, sent);
if (cl) {
wev->ready = 0;