Moved the code for coalescing file buffers to a separate function.

This commit is contained in:
Valentin Bartenev 2014-08-13 15:11:45 +04:00
parent f00918eab3
commit d85d459bb2
5 changed files with 53 additions and 72 deletions

View File

@ -220,6 +220,48 @@ ngx_chain_update_chains(ngx_pool_t *p, ngx_chain_t **free, ngx_chain_t **busy,
} }
off_t
ngx_chain_coalesce_file(ngx_chain_t **in, off_t limit)
{
off_t total, size, aligned, fprev;
ngx_fd_t fd;
ngx_chain_t *cl;
total = 0;
cl = *in;
fd = cl->buf->file->fd;
do {
size = cl->buf->file_last - cl->buf->file_pos;
if (size > limit - total) {
size = limit - total;
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;
}
}
total += size;
fprev = cl->buf->file_pos + size;
cl = cl->next;
} while (cl
&& cl->buf->in_file
&& total < limit
&& fd == cl->buf->file->fd
&& fprev == cl->buf->file_pos);
*in = cl;
return total;
}
ngx_chain_t * ngx_chain_t *
ngx_chain_update_sent(ngx_chain_t *in, off_t sent) ngx_chain_update_sent(ngx_chain_t *in, off_t sent)
{ {

View File

@ -158,6 +158,8 @@ 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, 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 **busy, ngx_chain_t **out, ngx_buf_tag_t tag);
off_t ngx_chain_coalesce_file(ngx_chain_t **in, off_t limit);
ngx_chain_t *ngx_chain_update_sent(ngx_chain_t *in, off_t sent); ngx_chain_t *ngx_chain_update_sent(ngx_chain_t *in, off_t sent);
#endif /* _NGX_BUF_H_INCLUDED_ */ #endif /* _NGX_BUF_H_INCLUDED_ */

View File

@ -31,7 +31,7 @@ ngx_chain_t *
ngx_darwin_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit) ngx_darwin_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)
{ {
int rc; int rc;
off_t size, send, prev_send, aligned, sent, fprev; off_t send, prev_send, sent;
off_t file_size; off_t file_size;
ngx_uint_t eintr; ngx_uint_t eintr;
ngx_err_t err; 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 */ /* coalesce the neighbouring file bufs */
do { file_size = ngx_chain_coalesce_file(&cl, limit - send);
size = cl->buf->file_last - cl->buf->file_pos;
if (send + size > limit) { send += file_size;
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);
} }
if (file && header.count == 0) { if (file && header.count == 0) {

View File

@ -33,7 +33,7 @@ ngx_chain_t *
ngx_freebsd_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit) ngx_freebsd_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)
{ {
int rc, flags; int rc, flags;
off_t size, send, prev_send, aligned, sent, fprev; off_t send, prev_send, sent;
size_t file_size; size_t file_size;
ngx_uint_t eintr, eagain; ngx_uint_t eintr, eagain;
ngx_err_t err; 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 */ /* coalesce the neighbouring file bufs */
do { file_size = (size_t) ngx_chain_coalesce_file(&cl, limit - send);
size = cl->buf->file_last - cl->buf->file_pos;
if (send + size > limit) { send += file_size;
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);
} }

View File

@ -31,7 +31,7 @@ ngx_chain_t *
ngx_linux_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit) ngx_linux_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)
{ {
int rc, tcp_nodelay; int rc, tcp_nodelay;
off_t size, send, prev_send, aligned, sent, fprev; off_t send, prev_send, sent;
size_t file_size; size_t file_size;
ngx_err_t err; ngx_err_t err;
ngx_buf_t *file; 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 */ /* coalesce the neighbouring file bufs */
do { file_size = (size_t) ngx_chain_coalesce_file(&cl, limit - send);
size = cl->buf->file_last - cl->buf->file_pos;
if (send + size > limit) { send += file_size;
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);
} }
if (file) { if (file) {