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 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 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