xref: /unit/src/nxt_buf_pool.h (revision 0)
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