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