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 static void nxt_buf_completion(nxt_thread_t *thr, void *obj, void *data); 11*0Sigor@sysoev.ru 12*0Sigor@sysoev.ru 13*0Sigor@sysoev.ru nxt_buf_t * 14*0Sigor@sysoev.ru nxt_buf_mem_alloc(nxt_mem_pool_t *mp, size_t size, nxt_uint_t flags) 15*0Sigor@sysoev.ru { 16*0Sigor@sysoev.ru nxt_buf_t *b; 17*0Sigor@sysoev.ru 18*0Sigor@sysoev.ru b = nxt_mem_cache_zalloc0(mp, NXT_BUF_MEM_SIZE); 19*0Sigor@sysoev.ru if (nxt_slow_path(b == NULL)) { 20*0Sigor@sysoev.ru return NULL; 21*0Sigor@sysoev.ru } 22*0Sigor@sysoev.ru 23*0Sigor@sysoev.ru b->data = mp; 24*0Sigor@sysoev.ru b->completion_handler = nxt_buf_completion; 25*0Sigor@sysoev.ru b->size = NXT_BUF_MEM_SIZE; 26*0Sigor@sysoev.ru 27*0Sigor@sysoev.ru if (size != 0) { 28*0Sigor@sysoev.ru b->mem.start = nxt_mem_buf(mp, &size, flags); 29*0Sigor@sysoev.ru if (nxt_slow_path(b->mem.start == NULL)) { 30*0Sigor@sysoev.ru return NULL; 31*0Sigor@sysoev.ru } 32*0Sigor@sysoev.ru 33*0Sigor@sysoev.ru b->mem.pos = b->mem.start; 34*0Sigor@sysoev.ru b->mem.free = b->mem.start; 35*0Sigor@sysoev.ru b->mem.end = b->mem.start + size; 36*0Sigor@sysoev.ru } 37*0Sigor@sysoev.ru 38*0Sigor@sysoev.ru return b; 39*0Sigor@sysoev.ru } 40*0Sigor@sysoev.ru 41*0Sigor@sysoev.ru 42*0Sigor@sysoev.ru nxt_buf_t * 43*0Sigor@sysoev.ru nxt_buf_file_alloc(nxt_mem_pool_t *mp, size_t size, nxt_uint_t flags) 44*0Sigor@sysoev.ru { 45*0Sigor@sysoev.ru nxt_buf_t *b; 46*0Sigor@sysoev.ru 47*0Sigor@sysoev.ru b = nxt_mem_cache_zalloc0(mp, NXT_BUF_FILE_SIZE); 48*0Sigor@sysoev.ru if (nxt_slow_path(b == NULL)) { 49*0Sigor@sysoev.ru return NULL; 50*0Sigor@sysoev.ru } 51*0Sigor@sysoev.ru 52*0Sigor@sysoev.ru b->data = mp; 53*0Sigor@sysoev.ru b->completion_handler = nxt_buf_completion; 54*0Sigor@sysoev.ru b->size = NXT_BUF_FILE_SIZE; 55*0Sigor@sysoev.ru nxt_buf_set_file(b); 56*0Sigor@sysoev.ru 57*0Sigor@sysoev.ru if (size != 0) { 58*0Sigor@sysoev.ru b->mem.start = nxt_mem_buf(mp, &size, flags); 59*0Sigor@sysoev.ru if (nxt_slow_path(b->mem.start == NULL)) { 60*0Sigor@sysoev.ru return NULL; 61*0Sigor@sysoev.ru } 62*0Sigor@sysoev.ru 63*0Sigor@sysoev.ru b->mem.pos = b->mem.start; 64*0Sigor@sysoev.ru b->mem.free = b->mem.start; 65*0Sigor@sysoev.ru b->mem.end = b->mem.start + size; 66*0Sigor@sysoev.ru } 67*0Sigor@sysoev.ru 68*0Sigor@sysoev.ru return b; 69*0Sigor@sysoev.ru } 70*0Sigor@sysoev.ru 71*0Sigor@sysoev.ru 72*0Sigor@sysoev.ru nxt_buf_t * 73*0Sigor@sysoev.ru nxt_buf_mmap_alloc(nxt_mem_pool_t *mp, size_t size) 74*0Sigor@sysoev.ru { 75*0Sigor@sysoev.ru nxt_buf_t *b; 76*0Sigor@sysoev.ru 77*0Sigor@sysoev.ru b = nxt_mem_cache_zalloc0(mp, NXT_BUF_MMAP_SIZE); 78*0Sigor@sysoev.ru 79*0Sigor@sysoev.ru if (nxt_fast_path(b != NULL)) { 80*0Sigor@sysoev.ru b->data = mp; 81*0Sigor@sysoev.ru b->completion_handler = nxt_buf_completion; 82*0Sigor@sysoev.ru b->size = NXT_BUF_MMAP_SIZE; 83*0Sigor@sysoev.ru 84*0Sigor@sysoev.ru nxt_buf_set_file(b); 85*0Sigor@sysoev.ru nxt_buf_set_mmap(b); 86*0Sigor@sysoev.ru nxt_buf_mem_set_size(&b->mem, size); 87*0Sigor@sysoev.ru } 88*0Sigor@sysoev.ru 89*0Sigor@sysoev.ru return b; 90*0Sigor@sysoev.ru } 91*0Sigor@sysoev.ru 92*0Sigor@sysoev.ru 93*0Sigor@sysoev.ru nxt_buf_t * 94*0Sigor@sysoev.ru nxt_buf_sync_alloc(nxt_mem_pool_t *mp, nxt_uint_t flags) 95*0Sigor@sysoev.ru { 96*0Sigor@sysoev.ru nxt_buf_t *b; 97*0Sigor@sysoev.ru 98*0Sigor@sysoev.ru b = nxt_mem_cache_zalloc0(mp, NXT_BUF_SYNC_SIZE); 99*0Sigor@sysoev.ru 100*0Sigor@sysoev.ru if (nxt_fast_path(b != NULL)) { 101*0Sigor@sysoev.ru b->data = mp; 102*0Sigor@sysoev.ru b->completion_handler = nxt_buf_completion; 103*0Sigor@sysoev.ru b->size = NXT_BUF_SYNC_SIZE; 104*0Sigor@sysoev.ru 105*0Sigor@sysoev.ru nxt_buf_set_sync(b); 106*0Sigor@sysoev.ru b->is_nobuf = ((flags & NXT_BUF_SYNC_NOBUF) != 0); 107*0Sigor@sysoev.ru b->is_flush = ((flags & NXT_BUF_SYNC_FLUSH) != 0); 108*0Sigor@sysoev.ru b->is_last = ((flags & NXT_BUF_SYNC_LAST) != 0); 109*0Sigor@sysoev.ru } 110*0Sigor@sysoev.ru 111*0Sigor@sysoev.ru return b; 112*0Sigor@sysoev.ru } 113*0Sigor@sysoev.ru 114*0Sigor@sysoev.ru 115*0Sigor@sysoev.ru void 116*0Sigor@sysoev.ru nxt_buf_chain_add(nxt_buf_t **head, nxt_buf_t *in) 117*0Sigor@sysoev.ru { 118*0Sigor@sysoev.ru nxt_buf_t *b, **prev; 119*0Sigor@sysoev.ru 120*0Sigor@sysoev.ru prev = head; 121*0Sigor@sysoev.ru 122*0Sigor@sysoev.ru for (b = *head; b != NULL; b = b->next) { 123*0Sigor@sysoev.ru prev = &b->next; 124*0Sigor@sysoev.ru } 125*0Sigor@sysoev.ru 126*0Sigor@sysoev.ru *prev = in; 127*0Sigor@sysoev.ru } 128*0Sigor@sysoev.ru 129*0Sigor@sysoev.ru 130*0Sigor@sysoev.ru size_t 131*0Sigor@sysoev.ru nxt_buf_chain_length(nxt_buf_t *b) 132*0Sigor@sysoev.ru { 133*0Sigor@sysoev.ru size_t length; 134*0Sigor@sysoev.ru 135*0Sigor@sysoev.ru length = 0; 136*0Sigor@sysoev.ru 137*0Sigor@sysoev.ru while (b != NULL) { 138*0Sigor@sysoev.ru length += b->mem.free - b->mem.pos; 139*0Sigor@sysoev.ru b = b->next; 140*0Sigor@sysoev.ru } 141*0Sigor@sysoev.ru 142*0Sigor@sysoev.ru return length; 143*0Sigor@sysoev.ru } 144*0Sigor@sysoev.ru 145*0Sigor@sysoev.ru 146*0Sigor@sysoev.ru static void 147*0Sigor@sysoev.ru nxt_buf_completion(nxt_thread_t *thr, void *obj, void *data) 148*0Sigor@sysoev.ru { 149*0Sigor@sysoev.ru nxt_buf_t *b, *parent; 150*0Sigor@sysoev.ru nxt_mem_pool_t *mp; 151*0Sigor@sysoev.ru 152*0Sigor@sysoev.ru b = obj; 153*0Sigor@sysoev.ru parent = data; 154*0Sigor@sysoev.ru 155*0Sigor@sysoev.ru nxt_log_debug(thr->log, "buf completion: %p %p", b, b->mem.start); 156*0Sigor@sysoev.ru 157*0Sigor@sysoev.ru mp = b->data; 158*0Sigor@sysoev.ru nxt_buf_free(mp, b); 159*0Sigor@sysoev.ru 160*0Sigor@sysoev.ru if (parent != NULL) { 161*0Sigor@sysoev.ru nxt_log_debug(thr->log, "parent retain:%uD", parent->retain); 162*0Sigor@sysoev.ru 163*0Sigor@sysoev.ru parent->retain--; 164*0Sigor@sysoev.ru 165*0Sigor@sysoev.ru if (parent->retain == 0) { 166*0Sigor@sysoev.ru parent->mem.pos = parent->mem.free; 167*0Sigor@sysoev.ru 168*0Sigor@sysoev.ru parent->completion_handler(thr, parent, parent->parent); 169*0Sigor@sysoev.ru } 170*0Sigor@sysoev.ru } 171*0Sigor@sysoev.ru } 172