summaryrefslogtreecommitdiffhomepage
path: root/src/nxt_buf_pool.h
blob: 3d22d7fa0a71e1a9b9c4fef2c1ae8c9079a24716 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75

/*
 * Copyright (C) Igor Sysoev
 * Copyright (C) NGINX, Inc.
 */

#ifndef _NXT_BUF_POOL_H_INCLUDED_
#define _NXT_BUF_POOL_H_INCLUDED_


/*
 * nxt_buf_pool_t is intended to allocate up to the "max" number
 * memory, memory/file, or mmap/file buffers.  A size of the buffers
 * is set in the "size" field.  The size however can be overridden in
 * nxt_buf_pool_XXX_alloc() by the "size" argument if the argument is
 * not zero and lesser than or equal to the "size" field multiplied
 * by 1.25.  The "flags" field is passed as the nxt_mem_buf() flags.
 */

typedef struct {
    nxt_buf_t       *current;
    nxt_buf_t       *free;
    nxt_mp_t        *mem_pool;

    uint16_t        num;
    uint16_t        max;

    uint32_t        size;

    uint8_t         flags;     /* 2 bits */
    uint8_t         destroy;   /* 1 bit */
    uint8_t         mmap;      /* 1 bit */
} nxt_buf_pool_t;


NXT_EXPORT nxt_int_t nxt_buf_pool_mem_alloc(nxt_buf_pool_t *bp, size_t size);
NXT_EXPORT nxt_int_t nxt_buf_pool_file_alloc(nxt_buf_pool_t *bp, size_t size);
NXT_EXPORT nxt_int_t nxt_buf_pool_mmap_alloc(nxt_buf_pool_t *bp, size_t size);
NXT_EXPORT void nxt_buf_pool_free(nxt_buf_pool_t *bp, nxt_buf_t *b);
NXT_EXPORT void nxt_buf_pool_destroy(nxt_buf_pool_t *bp);


/* There is ready free buffer. */

#define nxt_buf_pool_ready(bp)                                                \
    ((bp)->free != NULL                                                       \
     || ((bp)->current != NULL                                                \
         && (bp)->current->mem.free < (bp)->current->mem.end))


/* A free buffer is allowed to be allocated. */

#define nxt_buf_pool_obtainable(bp)                                           \
    ((bp)->num < (bp)->max)


/* There is ready free buffer or it is allowed to be allocated. */

#define nxt_buf_pool_available(bp)                                            \
    (nxt_buf_pool_obtainable(bp) || nxt_buf_pool_ready(bp))


/* Reserve allocation of "n" free buffers as they were allocated. */

#define nxt_buf_pool_reserve(bp, n)                                           \
    (bp)->num += (n)


/* Release a reservation. */

#define nxt_buf_pool_release(bp, n)                                           \
    (bp)->num -= (n)


#endif /* _NXT_BUF_POOL_H_INCLUDED_ */