2 * @brief Memory allocation functions.
12 /** MEMALLOC declares the allocators for a class to allocate
13 * memory in the non-snapshotting heap. */
15 void * operator new(size_t size) { \
16 return model_malloc(size); \
18 void operator delete(void *p, size_t size) { \
21 void * operator new[](size_t size) { \
22 return model_malloc(size); \
24 void operator delete[](void *p, size_t size) { \
28 /** SNAPSHOTALLOC declares the allocators for a class to allocate
29 * memory in the snapshotting heap. */
30 #define SNAPSHOTALLOC \
31 void * operator new(size_t size) { \
32 return snapshot_malloc(size); \
34 void operator delete(void *p, size_t size) { \
37 void * operator new[](size_t size) { \
38 return snapshot_malloc(size); \
40 void operator delete[](void *p, size_t size) { \
44 void *model_malloc(size_t size);
45 void *model_calloc(size_t count, size_t size);
46 void model_free(void *ptr);
48 void * snapshot_malloc(size_t size);
49 void * snapshot_calloc(size_t count, size_t size);
50 void * snapshot_realloc(void *ptr, size_t size);
51 void snapshot_free(void *ptr);
53 /** @brief Provides a non-snapshotting allocator for use in STL classes.
55 * The code was adapted from a code example from the book The C++
56 * Standard Library - A Tutorial and Reference by Nicolai M. Josuttis,
57 * Addison-Wesley, 1999 © Copyright Nicolai M. Josuttis 1999
58 * Permission to copy, use, modify, sell and distribute this software
59 * is granted provided this copyright notice appears in all copies.
60 * This software is provided "as is" without express or implied
61 * warranty, and with no claim as to its suitability for any purpose.
69 typedef const T* const_pointer;
71 typedef const T& const_reference;
72 typedef size_t size_type;
73 typedef size_t difference_type;
75 // rebind allocator to type U
78 typedef ModelAlloc<U> other;
81 // return address of values
82 pointer address(reference value) const {
85 const_pointer address(const_reference value) const {
89 /* constructors and destructor
90 * - nothing to do because the allocator has no state
92 ModelAlloc() throw() {
94 ModelAlloc(const ModelAlloc&) throw() {
97 ModelAlloc(const ModelAlloc<U>&) throw() {
99 ~ModelAlloc() throw() {
102 // return maximum number of elements that can be allocated
103 size_type max_size() const throw() {
104 return std::numeric_limits<size_t>::max() / sizeof(T);
107 // allocate but don't initialize num elements of type T
108 pointer allocate(size_type num, const void * = 0) {
109 pointer p = (pointer)model_malloc(num * sizeof(T));
113 // initialize elements of allocated storage p with value value
114 void construct(pointer p, const T& value) {
115 // initialize memory with placement new
116 new((void*)p)T(value);
119 // destroy elements of initialized storage p
120 void destroy(pointer p) {
121 // destroy objects by calling their destructor
125 // deallocate storage p of deleted elements
126 void deallocate(pointer p, size_type num) {
127 model_free((void*)p);
131 /** Return that all specializations of this allocator are interchangeable. */
132 template <class T1, class T2>
133 bool operator ==(const ModelAlloc<T1>&,
134 const ModelAlloc<T2>&) throw() {
138 /** Return that all specializations of this allocator are interchangeable. */
139 template <class T1, class T2>
140 bool operator!= (const ModelAlloc<T1>&,
141 const ModelAlloc<T2>&) throw() {
145 /** @brief Provides a snapshotting allocator for use in STL classes.
147 * The code was adapted from a code example from the book The C++
148 * Standard Library - A Tutorial and Reference by Nicolai M. Josuttis,
149 * Addison-Wesley, 1999 © Copyright Nicolai M. Josuttis 1999
150 * Permission to copy, use, modify, sell and distribute this software
151 * is granted provided this copyright notice appears in all copies.
152 * This software is provided "as is" without express or implied
153 * warranty, and with no claim as to its suitability for any purpose.
156 class SnapshotAlloc {
159 typedef T value_type;
161 typedef const T* const_pointer;
162 typedef T& reference;
163 typedef const T& const_reference;
164 typedef size_t size_type;
165 typedef size_t difference_type;
167 // rebind allocator to type U
170 typedef SnapshotAlloc<U> other;
173 // return address of values
174 pointer address(reference value) const {
177 const_pointer address(const_reference value) const {
181 /* constructors and destructor
182 * - nothing to do because the allocator has no state
184 SnapshotAlloc() throw() {
186 SnapshotAlloc(const SnapshotAlloc&) throw() {
189 SnapshotAlloc(const SnapshotAlloc<U>&) throw() {
191 ~SnapshotAlloc() throw() {
194 // return maximum number of elements that can be allocated
195 size_type max_size() const throw() {
196 return std::numeric_limits<size_t>::max() / sizeof(T);
199 // allocate but don't initialize num elements of type T
200 pointer allocate(size_type num, const void * = 0) {
201 pointer p = (pointer)snapshot_malloc(num * sizeof(T));
205 // initialize elements of allocated storage p with value value
206 void construct(pointer p, const T& value) {
207 // initialize memory with placement new
208 new((void*)p)T(value);
211 // destroy elements of initialized storage p
212 void destroy(pointer p) {
213 // destroy objects by calling their destructor
217 // deallocate storage p of deleted elements
218 void deallocate(pointer p, size_type num) {
219 snapshot_free((void*)p);
223 /** Return that all specializations of this allocator are interchangeable. */
224 template <class T1, class T2>
225 bool operator ==(const SnapshotAlloc<T1>&,
226 const SnapshotAlloc<T2>&) throw() {
230 /** Return that all specializations of this allocator are interchangeable. */
231 template <class T1, class T2>
232 bool operator!= (const SnapshotAlloc<T1>&,
233 const SnapshotAlloc<T2>&) throw() {
240 typedef void * mspace;
241 extern void * mspace_malloc(mspace msp, size_t bytes);
242 extern void mspace_free(mspace msp, void* mem);
243 extern void * mspace_realloc(mspace msp, void* mem, size_t newsize);
244 extern void * mspace_calloc(mspace msp, size_t n_elements, size_t elem_size);
245 extern mspace create_mspace_with_base(void* base, size_t capacity, int locked);
246 extern mspace create_mspace(size_t capacity, int locked);
248 #if USE_MPROTECT_SNAPSHOT
249 extern mspace user_snapshot_space;
252 extern mspace model_snapshot_space;
255 }; /* end of extern "C" */
258 #endif /* _MY_MEMORY_H */