From 00ecf713e36de2a5efffe761458b7ac0328bce87 Mon Sep 17 00:00:00 2001 From: Max Romanov Date: Wed, 4 Oct 2017 15:03:45 +0300 Subject: Port message fragmentation supported. - Each sendmsg() transmits no more than port->max_size payload data. - Longer buffers are fragmented and send using multiple sendmsg() calls. - On receive side, buffers are connected in chain. - Number of handler calls is the same as number of nxt_port_socket_write() calls. - nxt_buf_make_plain() function introduced to make single plain buffer from the chain. --- src/nxt_buf.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) (limited to 'src/nxt_buf.c') diff --git a/src/nxt_buf.c b/src/nxt_buf.c index 826cd017..7bc983a3 100644 --- a/src/nxt_buf.c +++ b/src/nxt_buf.c @@ -298,3 +298,33 @@ nxt_buf_ts_completion(nxt_task_t *task, void *obj, void *data) } } } + + +nxt_buf_t * +nxt_buf_make_plain(nxt_mp_t *mp, nxt_buf_t *src, size_t size) +{ + nxt_buf_t *b, *i; + + if (nxt_slow_path(size == 0)) { + for (i = src; i != NULL; i = i->next) { + size += nxt_buf_used_size(i); + } + } + + b = nxt_buf_mem_alloc(mp, size, 0); + + if (nxt_slow_path(b == NULL)) { + return NULL; + } + + for (i = src; i != NULL; i = i->next) { + if (nxt_slow_path(nxt_buf_mem_free_size(&b->mem) < + nxt_buf_used_size(i))) { + break; + } + + b->mem.free = nxt_cpymem(b->mem.free, i->mem.pos, nxt_buf_used_size(i)); + } + + return b; +} -- cgit