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