1*0Sigor@sysoev.ru
2*0Sigor@sysoev.ru /*
3*0Sigor@sysoev.ru * Copyright (C) Igor Sysoev
4*0Sigor@sysoev.ru * Copyright (C) NGINX, Inc.
5*0Sigor@sysoev.ru */
6*0Sigor@sysoev.ru
7*0Sigor@sysoev.ru #include <nxt_main.h>
8*0Sigor@sysoev.ru
9*0Sigor@sysoev.ru
10*0Sigor@sysoev.ru nxt_uint_t
nxt_recvbuf_mem_coalesce(nxt_recvbuf_coalesce_t * rb)11*0Sigor@sysoev.ru nxt_recvbuf_mem_coalesce(nxt_recvbuf_coalesce_t *rb)
12*0Sigor@sysoev.ru {
13*0Sigor@sysoev.ru u_char *last;
14*0Sigor@sysoev.ru size_t size, total;
15*0Sigor@sysoev.ru nxt_int_t n;
16*0Sigor@sysoev.ru nxt_buf_t *b;
17*0Sigor@sysoev.ru
18*0Sigor@sysoev.ru total = 0;
19*0Sigor@sysoev.ru last = NULL;
20*0Sigor@sysoev.ru n = -1;
21*0Sigor@sysoev.ru
22*0Sigor@sysoev.ru for (b = rb->buf; b != NULL; b = b->next) {
23*0Sigor@sysoev.ru
24*0Sigor@sysoev.ru nxt_prefetch(b->next);
25*0Sigor@sysoev.ru
26*0Sigor@sysoev.ru size = b->mem.end - b->mem.free;
27*0Sigor@sysoev.ru
28*0Sigor@sysoev.ru if (b->mem.free != last) {
29*0Sigor@sysoev.ru
30*0Sigor@sysoev.ru if (++n >= rb->nmax) {
31*0Sigor@sysoev.ru goto done;
32*0Sigor@sysoev.ru }
33*0Sigor@sysoev.ru
34*0Sigor@sysoev.ru nxt_iobuf_set(&rb->iobuf[n], b->mem.free, size);
35*0Sigor@sysoev.ru
36*0Sigor@sysoev.ru } else {
37*0Sigor@sysoev.ru nxt_iobuf_add(&rb->iobuf[n], size);
38*0Sigor@sysoev.ru }
39*0Sigor@sysoev.ru
40*0Sigor@sysoev.ru nxt_thread_log_debug("recvbuf: %ui, %p, %uz", n,
41*0Sigor@sysoev.ru nxt_iobuf_data(&rb->iobuf[n]),
42*0Sigor@sysoev.ru nxt_iobuf_size(&rb->iobuf[n]));
43*0Sigor@sysoev.ru
44*0Sigor@sysoev.ru total += size;
45*0Sigor@sysoev.ru last = b->mem.end;
46*0Sigor@sysoev.ru }
47*0Sigor@sysoev.ru
48*0Sigor@sysoev.ru n++;
49*0Sigor@sysoev.ru
50*0Sigor@sysoev.ru done:
51*0Sigor@sysoev.ru
52*0Sigor@sysoev.ru rb->size = total;
53*0Sigor@sysoev.ru
54*0Sigor@sysoev.ru return n;
55*0Sigor@sysoev.ru }
56*0Sigor@sysoev.ru
57*0Sigor@sysoev.ru
58*0Sigor@sysoev.ru void
nxt_recvbuf_update(nxt_buf_t * b,size_t sent)59*0Sigor@sysoev.ru nxt_recvbuf_update(nxt_buf_t *b, size_t sent)
60*0Sigor@sysoev.ru {
61*0Sigor@sysoev.ru size_t size;
62*0Sigor@sysoev.ru
63*0Sigor@sysoev.ru while (b != NULL && sent != 0) {
64*0Sigor@sysoev.ru
65*0Sigor@sysoev.ru nxt_prefetch(b->next);
66*0Sigor@sysoev.ru
67*0Sigor@sysoev.ru if (!nxt_buf_is_sync(b)) {
68*0Sigor@sysoev.ru
69*0Sigor@sysoev.ru size = b->mem.end - b->mem.free;
70*0Sigor@sysoev.ru
71*0Sigor@sysoev.ru if (sent < size) {
72*0Sigor@sysoev.ru b->mem.free += sent;
73*0Sigor@sysoev.ru return;
74*0Sigor@sysoev.ru }
75*0Sigor@sysoev.ru
76*0Sigor@sysoev.ru b->mem.free = b->mem.end;
77*0Sigor@sysoev.ru sent -= size;
78*0Sigor@sysoev.ru }
79*0Sigor@sysoev.ru
80*0Sigor@sysoev.ru b = b->next;
81*0Sigor@sysoev.ru }
82*0Sigor@sysoev.ru }
83