1 | /* -*- mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*- */ |
2 | // vim: ft=cpp:expandtab:ts=8:sw=4:softtabstop=4: |
3 | #ident "$Id$" |
4 | /*====== |
5 | This file is part of PerconaFT. |
6 | |
7 | |
8 | Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. |
9 | |
10 | PerconaFT is free software: you can redistribute it and/or modify |
11 | it under the terms of the GNU General Public License, version 2, |
12 | as published by the Free Software Foundation. |
13 | |
14 | PerconaFT is distributed in the hope that it will be useful, |
15 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
17 | GNU General Public License for more details. |
18 | |
19 | You should have received a copy of the GNU General Public License |
20 | along with PerconaFT. If not, see <http://www.gnu.org/licenses/>. |
21 | |
22 | ---------------------------------------- |
23 | |
24 | PerconaFT is free software: you can redistribute it and/or modify |
25 | it under the terms of the GNU Affero General Public License, version 3, |
26 | as published by the Free Software Foundation. |
27 | |
28 | PerconaFT is distributed in the hope that it will be useful, |
29 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
30 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
31 | GNU Affero General Public License for more details. |
32 | |
33 | You should have received a copy of the GNU Affero General Public License |
34 | along with PerconaFT. If not, see <http://www.gnu.org/licenses/>. |
35 | ======= */ |
36 | |
37 | #ident "Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved." |
38 | |
39 | #pragma once |
40 | |
41 | /* a memory pool is a contiguous region of memory that supports single |
42 | allocations from the pool. these allocated regions are never recycled. |
43 | when the memory pool no longer has free space, the allocated chunks |
44 | must be relocated by the application to a new memory pool. */ |
45 | |
46 | #include <stddef.h> |
47 | |
48 | struct mempool; |
49 | |
50 | // TODO 4050 Hide mempool struct internals from callers |
51 | |
52 | struct mempool { |
53 | void *base; /* the base address of the memory */ |
54 | size_t free_offset; /* the offset of the memory pool free space */ |
55 | size_t size; /* the size of the memory */ |
56 | size_t frag_size; /* the size of the fragmented memory */ |
57 | }; |
58 | |
59 | /* This is a constructor to be used when the memory for the mempool struct has been |
60 | * allocated by the caller, but no memory has yet been allocatd for the data. |
61 | */ |
62 | void toku_mempool_zero(struct mempool *mp); |
63 | |
64 | /* initialize the memory pool with the base address and size of a |
65 | contiguous chunk of memory */ |
66 | void toku_mempool_init(struct mempool *mp, void *base, size_t free_offset, size_t size); |
67 | |
68 | /* allocate memory and construct mempool |
69 | */ |
70 | void toku_mempool_construct(struct mempool *mp, size_t data_size); |
71 | |
72 | /* treat mempool as if it has just been created; ignore any frag and start allocating from beginning again. |
73 | */ |
74 | void toku_mempool_reset(struct mempool *mp); |
75 | |
76 | /* reallocate memory for construct mempool |
77 | */ |
78 | void toku_mempool_realloc_larger(struct mempool *mp, size_t data_size); |
79 | |
80 | /* destroy the memory pool */ |
81 | void toku_mempool_destroy(struct mempool *mp); |
82 | |
83 | /* get the base address of the memory pool */ |
84 | void *toku_mempool_get_base(const struct mempool *mp); |
85 | |
86 | /* get the a pointer that is offset bytes in front of base of the memory pool */ |
87 | void *toku_mempool_get_pointer_from_base_and_offset(const struct mempool *mp, size_t offset); |
88 | |
89 | /* get the offset from base of a pointer */ |
90 | size_t toku_mempool_get_offset_from_pointer_and_base(const struct mempool *mp, const void* p); |
91 | |
92 | /* get the a pointer of the first free byte (if any) */ |
93 | void* toku_mempool_get_next_free_ptr(const struct mempool *mp); |
94 | |
95 | /* get the limit of valid offsets. (anything later was not allocated) */ |
96 | size_t toku_mempool_get_offset_limit(const struct mempool *mp); |
97 | |
98 | /* get the size of the memory pool */ |
99 | size_t toku_mempool_get_size(const struct mempool *mp); |
100 | |
101 | /* get the amount of fragmented (wasted) space in the memory pool */ |
102 | size_t toku_mempool_get_frag_size(const struct mempool *mp); |
103 | |
104 | /* get the amount of space that is holding useful data */ |
105 | size_t toku_mempool_get_used_size(const struct mempool *mp); |
106 | |
107 | /* get the amount of space that is available for new data */ |
108 | size_t toku_mempool_get_free_size(const struct mempool *mp); |
109 | |
110 | /* get the amount of space that has been allocated for use (wasted or not) */ |
111 | size_t toku_mempool_get_allocated_size(const struct mempool *mp); |
112 | |
113 | /* allocate a chunk of memory from the memory pool */ |
114 | void *toku_mempool_malloc(struct mempool *mp, size_t size); |
115 | |
116 | /* free a previously allocated chunk of memory. the free only updates |
117 | a count of the amount of free space in the memory pool. the memory |
118 | pool does not keep track of the locations of the free chunks */ |
119 | void toku_mempool_mfree(struct mempool *mp, void *vp, size_t size); |
120 | |
121 | /* verify that a memory range is contained within a mempool */ |
122 | static inline int toku_mempool_inrange(struct mempool *mp, void *vp, size_t size) { |
123 | return (mp->base <= vp) && ((char *)vp + size <= (char *)mp->base + mp->size); |
124 | } |
125 | |
126 | /* get memory footprint */ |
127 | size_t (struct mempool *mp); |
128 | |
129 | void toku_mempool_clone(const struct mempool* orig_mp, struct mempool* new_mp); |
130 | |