aboutsummaryrefslogtreecommitdiff
path: root/src/os/unix/ngx_freebsd_write_chain.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/os/unix/ngx_freebsd_write_chain.c')
-rw-r--r--src/os/unix/ngx_freebsd_write_chain.c88
1 files changed, 45 insertions, 43 deletions
diff --git a/src/os/unix/ngx_freebsd_write_chain.c b/src/os/unix/ngx_freebsd_write_chain.c
index 71c897905..1c163779d 100644
--- a/src/os/unix/ngx_freebsd_write_chain.c
+++ b/src/os/unix/ngx_freebsd_write_chain.c
@@ -15,7 +15,7 @@ ngx_chain_t *ngx_freebsd_write_chain(ngx_connection_t *c, ngx_chain_t *in)
{
int rc;
char *prev;
- size_t hsize;
+ size_t hsize, size;
off_t sent;
struct iovec *iov;
struct sf_hdtr hdtr;
@@ -32,54 +32,54 @@ ngx_chain_t *ngx_freebsd_write_chain(ngx_connection_t *c, ngx_chain_t *in)
ngx_init_array(trailer, c->pool, 10, sizeof(struct iovec), NGX_CHAIN_ERROR);
/* create the header iovec */
- if (ce->hunk->type & NGX_HUNK_IN_MEMORY) {
+ if (ngx_hunk_in_memory_only(ce->hunk)) {
prev = NULL;
iov = NULL;
/* create the iovec and coalesce the neighbouring chain entries */
- while (ce && (ce->hunk->type & NGX_HUNK_IN_MEMORY))
- {
- if (prev == ce->hunk->pos.mem) {
- iov->iov_len += ce->hunk->last.mem - ce->hunk->pos.mem;
- prev = ce->hunk->last.mem;
+ while (ce && ngx_hunk_in_memory_only(ce->hunk)) {
+
+ if (prev == ce->hunk->pos) {
+ iov->iov_len += ce->hunk->last - ce->hunk->pos;
+ prev = ce->hunk->last;
} else {
ngx_test_null(iov, ngx_push_array(&header), NGX_CHAIN_ERROR);
- iov->iov_base = ce->hunk->pos.mem;
- iov->iov_len = ce->hunk->last.mem - ce->hunk->pos.mem;
- prev = ce->hunk->last.mem;
+ iov->iov_base = ce->hunk->pos;
+ iov->iov_len = ce->hunk->last - ce->hunk->pos;
+ prev = ce->hunk->last;
}
#if (HAVE_FREEBSD_SENDFILE_NBYTES_BUG)
- hsize += ce->hunk->last.mem - ce->hunk->pos.mem;
+ hsize += ce->hunk->last - ce->hunk->pos;
#endif
ce = ce->next;
}
}
- /* TODO: coalesce the neighbouring shadow file hunks */
+ /* TODO: coalesce the neighbouring file hunks */
if (ce && (ce->hunk->type & NGX_HUNK_FILE)) {
file = ce->hunk;
ce = ce->next;
}
/* create the trailer iovec */
- if (ce && ce->hunk->type & NGX_HUNK_IN_MEMORY) {
+ if (ce && ngx_hunk_in_memory_only(ce->hunk)) {
prev = NULL;
iov = NULL;
/* create the iovec and coalesce the neighbouring chain entries */
- while (ce && (ce->hunk->type & NGX_HUNK_IN_MEMORY)) {
+ while (ce && ngx_hunk_in_memory_only(ce->hunk)) {
- if (prev == ce->hunk->pos.mem) {
- iov->iov_len += ce->hunk->last.mem - ce->hunk->pos.mem;
- prev = ce->hunk->last.mem;
+ if (prev == ce->hunk->pos) {
+ iov->iov_len += ce->hunk->last - ce->hunk->pos;
+ prev = ce->hunk->last;
} else {
ngx_test_null(iov, ngx_push_array(&trailer), NGX_CHAIN_ERROR);
- iov->iov_base = ce->hunk->pos.mem;
- iov->iov_len = ce->hunk->last.mem - ce->hunk->pos.mem;
- prev = ce->hunk->last.mem;
+ iov->iov_base = ce->hunk->pos;
+ iov->iov_len = ce->hunk->last - ce->hunk->pos;
+ prev = ce->hunk->last;
}
ce = ce->next;
@@ -92,8 +92,8 @@ ngx_chain_t *ngx_freebsd_write_chain(ngx_connection_t *c, ngx_chain_t *in)
hdtr.trailers = (struct iovec *) trailer.elts;
hdtr.trl_cnt = trailer.nelts;
- rc = sendfile(file->file->fd, c->fd, file->pos.file,
- (size_t) (file->last.file - file->pos.file) + hsize,
+ rc = sendfile(file->file->fd, c->fd, file->file_pos,
+ (size_t) (file->file_last - file->file_pos) + hsize,
&hdtr, &sent, 0);
if (rc == -1) {
@@ -110,8 +110,8 @@ ngx_chain_t *ngx_freebsd_write_chain(ngx_connection_t *c, ngx_chain_t *in)
#if (NGX_DEBUG_WRITE_CHAIN)
ngx_log_debug(c->log, "sendfile: %d, @%qd %qd:%d" _
- rc _ file->pos.file _ *sent _
- (size_t) (file->last.file - file->pos.file) + hsize);
+ rc _ file->file_pos _ sent _
+ (size_t) (file->file_last - file->file_pos) + hsize);
#endif
} else {
@@ -142,31 +142,33 @@ ngx_chain_t *ngx_freebsd_write_chain(ngx_connection_t *c, ngx_chain_t *in)
for (ce = in; ce; ce = ce->next) {
-#if (NGX_DEBUG_WRITE_CHAIN)
- ngx_log_debug(c->log, "write chain: %x %qx %qd" _
- ce->hunk->type _
- ce->hunk->pos.file _
- ce->hunk->last.file - ce->hunk->pos.file);
-#endif
+ if (ce->hunk->type & NGX_HUNK_IN_MEMORY) {
+ size = ce->hunk->last - ce->hunk->pos;
+ } else {
+ size = ce->hunk->file_last - ce->hunk->file_pos;
+ }
- if (sent >= ce->hunk->last.file - ce->hunk->pos.file) {
- sent -= ce->hunk->last.file - ce->hunk->pos.file;
- ce->hunk->pos.file = ce->hunk->last.file;
+ if (sent >= size) {
+ sent -= size;
+
+ if (ce->hunk->type & NGX_HUNK_IN_MEMORY) {
+ ce->hunk->pos = ce->hunk->last;
+ }
+
+ if (ce->hunk->type & NGX_HUNK_FILE) {
+ ce->hunk->file_pos = ce->hunk->file_last;
+ }
-#if (NGX_DEBUG_WRITE_CHAIN)
- ngx_log_debug(c->log, "write chain done: %qx %qd" _
- ce->hunk->pos.file _ sent);
-#endif
continue;
}
- ce->hunk->pos.file += sent;
+ if (ce->hunk->type & NGX_HUNK_IN_MEMORY) {
+ ce->hunk->pos += sent;
+ }
-#if (NGX_DEBUG_WRITE_CHAIN)
- ngx_log_debug(c->log, "write chain rest: %qx %qd" _
- ce->hunk->pos.file _
- ce->hunk->last.file - ce->hunk->pos.file);
-#endif
+ if (ce->hunk->type & NGX_HUNK_FILE) {
+ ce->hunk->file_pos += sent;
+ }
break;
}