summaryrefslogtreecommitdiffhomepage
path: root/src/nxt_buf.c
diff options
context:
space:
mode:
authorMax Romanov <max.romanov@nginx.com>2017-10-04 15:03:45 +0300
committerMax Romanov <max.romanov@nginx.com>2017-10-04 15:03:45 +0300
commit00ecf713e36de2a5efffe761458b7ac0328bce87 (patch)
treed10e45f41d972326c4e5469a2cf4248a465514b6 /src/nxt_buf.c
parent0faecee609b66a353d27499ca78ff6abcd3fef14 (diff)
downloadunit-00ecf713e36de2a5efffe761458b7ac0328bce87.tar.gz
unit-00ecf713e36de2a5efffe761458b7ac0328bce87.tar.bz2
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.
Diffstat (limited to 'src/nxt_buf.c')
-rw-r--r--src/nxt_buf.c30
1 files changed, 30 insertions, 0 deletions
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;
+}