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.
This commit is contained in:
Max Romanov
2017-10-04 15:03:45 +03:00
parent 0faecee609
commit 00ecf713e3
9 changed files with 273 additions and 28 deletions

View File

@@ -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;
}