xref: /unit/src/nxt_recvbuf.c (revision 0:a63ceefd6ab0)
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