diff options
-rw-r--r-- | src/nxt_application.c | 45 | ||||
-rw-r--r-- | src/nxt_port_memory.c | 14 | ||||
-rw-r--r-- | src/nxt_port_memory_int.h | 4 |
3 files changed, 31 insertions, 32 deletions
diff --git a/src/nxt_application.c b/src/nxt_application.c index 8b5779c3..b2b7f9c0 100644 --- a/src/nxt_application.c +++ b/src/nxt_application.c @@ -12,6 +12,7 @@ #include <nxt_router.h> #include <nxt_http.h> #include <nxt_application.h> +#include <nxt_port_memory_int.h> #include <glob.h> @@ -500,15 +501,6 @@ nxt_app_msg_write_get_buf(nxt_task_t *task, nxt_app_wmsg_t *msg, size_t size) } *msg->buf = b; - - free_size = nxt_buf_mem_free_size(&b->mem); - - if (nxt_slow_path(free_size < size)) { - nxt_log(task, NXT_LOG_WARN, "requested buffer too big " - "(%z < %z)", free_size, size); - return NULL; - } - } free_size = nxt_buf_mem_free_size(&b->mem); @@ -824,8 +816,8 @@ nxt_int_t nxt_app_msg_write_raw(nxt_task_t *task, nxt_app_wmsg_t *msg, const u_char *c, size_t size) { - size_t free_size, copy_size; - nxt_buf_t *b; + size_t free_size, copy_size; + nxt_buf_t *b; nxt_debug(task, "nxt_app_msg_write_raw: %uz", size); @@ -833,30 +825,37 @@ nxt_app_msg_write_raw(nxt_task_t *task, nxt_app_wmsg_t *msg, const u_char *c, b = *msg->buf; if (b == NULL) { - b = nxt_port_mmap_get_buf(task, msg->port, size); + free_size = nxt_min(size, PORT_MMAP_DATA_SIZE); + + b = nxt_port_mmap_get_buf(task, msg->port, free_size); if (nxt_slow_path(b == NULL)) { return NXT_ERROR; } *msg->buf = b; - } - do { + } else { free_size = nxt_buf_mem_free_size(&b->mem); - if (free_size > 0) { - copy_size = nxt_min(free_size, size); + if (free_size < size + && nxt_port_mmap_increase_buf(task, b, size, 1) == NXT_OK) + { + free_size = nxt_buf_mem_free_size(&b->mem); + } + } + + if (free_size > 0) { + copy_size = nxt_min(free_size, size); - b->mem.free = nxt_cpymem(b->mem.free, c, copy_size); + b->mem.free = nxt_cpymem(b->mem.free, c, copy_size); - size -= copy_size; - c += copy_size; + size -= copy_size; + c += copy_size; - if (size == 0) { - return NXT_OK; - } + if (size == 0) { + return NXT_OK; } - } while (nxt_port_mmap_increase_buf(task, b, size, 1) == NXT_OK); + } msg->buf = &b->next; } diff --git a/src/nxt_port_memory.c b/src/nxt_port_memory.c index 0c10cdd2..e8af381f 100644 --- a/src/nxt_port_memory.c +++ b/src/nxt_port_memory.c @@ -255,11 +255,12 @@ fail: static nxt_port_mmap_handler_t * nxt_port_new_port_mmap(nxt_task_t *task, nxt_process_t *process, - nxt_port_t *port, nxt_bool_t tracking) + nxt_port_t *port, nxt_int_t n, nxt_bool_t tracking) { void *mem; u_char *p, name[64]; nxt_fd_t fd; + nxt_int_t i; nxt_free_map_t *free_map; nxt_port_mmap_t *port_mmap; nxt_port_mmap_header_t *hdr; @@ -366,7 +367,9 @@ nxt_port_new_port_mmap(nxt_task_t *task, nxt_process_t *process, /* Mark first chunk as busy */ free_map = tracking ? hdr->free_tracking_map : hdr->free_map; - nxt_port_mmap_set_chunk_busy(free_map, 0); + for (i = 0; i < n; i++) { + nxt_port_mmap_set_chunk_busy(free_map, i); + } /* Mark as busy chunk followed the last available chunk. */ nxt_port_mmap_set_chunk_busy(hdr->free_map, PORT_MMAP_CHUNK_COUNT); @@ -456,7 +459,7 @@ nxt_port_mmap_get(nxt_task_t *task, nxt_port_t *port, nxt_chunk_id_t *c, /* TODO introduce port_mmap limit and release wait. */ *c = 0; - mmap_handler = nxt_port_new_port_mmap(task, process, port, tracking); + mmap_handler = nxt_port_new_port_mmap(task, process, port, n, tracking); unlock_return: @@ -710,10 +713,7 @@ nxt_port_mmap_increase_buf(nxt_task_t *task, nxt_buf_t *b, size_t size, size -= free_size; - nchunks = size / PORT_MMAP_CHUNK_SIZE; - if ((size % PORT_MMAP_CHUNK_SIZE) != 0 || nchunks == 0) { - nchunks++; - } + nchunks = (size + PORT_MMAP_CHUNK_SIZE - 1) / PORT_MMAP_CHUNK_SIZE; c = start; diff --git a/src/nxt_port_memory_int.h b/src/nxt_port_memory_int.h index e56eb4c8..53dfaebf 100644 --- a/src/nxt_port_memory_int.h +++ b/src/nxt_port_memory_int.h @@ -89,7 +89,7 @@ struct nxt_port_mmap_tracking_msg_s { nxt_chunk_id_t tracking_id; /* Tracking index. */ }; -static nxt_bool_t +nxt_inline nxt_bool_t nxt_port_mmap_get_free_chunk(nxt_free_map_t *m, nxt_chunk_id_t *c); #define nxt_port_mmap_get_chunk_busy(m, c) \ @@ -126,7 +126,7 @@ nxt_port_mmap_chunk_start(nxt_port_mmap_header_t *hdr, nxt_chunk_id_t c) } -static nxt_bool_t +nxt_inline nxt_bool_t nxt_port_mmap_get_free_chunk(nxt_free_map_t *m, nxt_chunk_id_t *c) { const nxt_free_map_t default_mask = (nxt_free_map_t) -1; |