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