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:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user