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 #ifndef _NXT_BUF_POOL_H_INCLUDED_ 8*0Sigor@sysoev.ru #define _NXT_BUF_POOL_H_INCLUDED_ 9*0Sigor@sysoev.ru 10*0Sigor@sysoev.ru 11*0Sigor@sysoev.ru /* 12*0Sigor@sysoev.ru * nxt_buf_pool_t is intended to allocate up to the "max" number 13*0Sigor@sysoev.ru * memory, memory/file, or mmap/file buffers. A size of the buffers 14*0Sigor@sysoev.ru * is set in the "size" field. The size however can be overridden in 15*0Sigor@sysoev.ru * nxt_buf_pool_XXX_alloc() by the "size" argument if the argument is 16*0Sigor@sysoev.ru * not zero and lesser than or equal to the "size" field multiplied 17*0Sigor@sysoev.ru * by 1.25. The "flags" field is passed as the nxt_mem_buf() flags. 18*0Sigor@sysoev.ru */ 19*0Sigor@sysoev.ru 20*0Sigor@sysoev.ru typedef struct { 21*0Sigor@sysoev.ru nxt_buf_t *current; 22*0Sigor@sysoev.ru nxt_buf_t *free; 23*0Sigor@sysoev.ru nxt_mem_pool_t *mem_pool; 24*0Sigor@sysoev.ru 25*0Sigor@sysoev.ru uint16_t num; 26*0Sigor@sysoev.ru uint16_t max; 27*0Sigor@sysoev.ru 28*0Sigor@sysoev.ru uint32_t size; 29*0Sigor@sysoev.ru 30*0Sigor@sysoev.ru uint8_t flags; /* 2 bits */ 31*0Sigor@sysoev.ru uint8_t destroy; /* 1 bit */ 32*0Sigor@sysoev.ru uint8_t mmap; /* 1 bit */ 33*0Sigor@sysoev.ru } nxt_buf_pool_t; 34*0Sigor@sysoev.ru 35*0Sigor@sysoev.ru 36*0Sigor@sysoev.ru NXT_EXPORT nxt_int_t nxt_buf_pool_mem_alloc(nxt_buf_pool_t *bp, size_t size); 37*0Sigor@sysoev.ru NXT_EXPORT nxt_int_t nxt_buf_pool_file_alloc(nxt_buf_pool_t *bp, size_t size); 38*0Sigor@sysoev.ru NXT_EXPORT nxt_int_t nxt_buf_pool_mmap_alloc(nxt_buf_pool_t *bp, size_t size); 39*0Sigor@sysoev.ru NXT_EXPORT void nxt_buf_pool_free(nxt_buf_pool_t *bp, nxt_buf_t *b); 40*0Sigor@sysoev.ru NXT_EXPORT void nxt_buf_pool_destroy(nxt_buf_pool_t *bp); 41*0Sigor@sysoev.ru 42*0Sigor@sysoev.ru 43*0Sigor@sysoev.ru /* There is ready free buffer. */ 44*0Sigor@sysoev.ru 45*0Sigor@sysoev.ru #define \ 46*0Sigor@sysoev.ru nxt_buf_pool_ready(bp) \ 47*0Sigor@sysoev.ru ((bp)->free != NULL \ 48*0Sigor@sysoev.ru || ((bp)->current != NULL \ 49*0Sigor@sysoev.ru && (bp)->current->mem.free < (bp)->current->mem.end)) 50*0Sigor@sysoev.ru 51*0Sigor@sysoev.ru 52*0Sigor@sysoev.ru /* A free buffer is allowed to be allocated. */ 53*0Sigor@sysoev.ru 54*0Sigor@sysoev.ru #define \ 55*0Sigor@sysoev.ru nxt_buf_pool_obtainable(bp) \ 56*0Sigor@sysoev.ru ((bp)->num < (bp)->max) 57*0Sigor@sysoev.ru 58*0Sigor@sysoev.ru 59*0Sigor@sysoev.ru /* There is ready free buffer or it is allowed to be allocated. */ 60*0Sigor@sysoev.ru 61*0Sigor@sysoev.ru #define \ 62*0Sigor@sysoev.ru nxt_buf_pool_available(bp) \ 63*0Sigor@sysoev.ru (nxt_buf_pool_obtainable(bp) || nxt_buf_pool_ready(bp)) 64*0Sigor@sysoev.ru 65*0Sigor@sysoev.ru 66*0Sigor@sysoev.ru /* Reserve allocation of "n" free buffers as they were allocated. */ 67*0Sigor@sysoev.ru 68*0Sigor@sysoev.ru #define \ 69*0Sigor@sysoev.ru nxt_buf_pool_reserve(bp, n) \ 70*0Sigor@sysoev.ru (bp)->num += (n) 71*0Sigor@sysoev.ru 72*0Sigor@sysoev.ru 73*0Sigor@sysoev.ru /* Release a reservation. */ 74*0Sigor@sysoev.ru 75*0Sigor@sysoev.ru #define \ 76*0Sigor@sysoev.ru nxt_buf_pool_release(bp, n) \ 77*0Sigor@sysoev.ru (bp)->num -= (n) 78*0Sigor@sysoev.ru 79*0Sigor@sysoev.ru 80*0Sigor@sysoev.ru #endif /* _NXT_BUF_POOL_H_INCLUDED_ */ 81