-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathmymemory.h
267 lines (233 loc) · 7.14 KB
/
mymemory.h
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
/** @file mymemory.h
* @brief Memory allocation functions.
*/
#ifndef _MY_MEMORY_H
#define _MY_MEMORY_H
#include <limits>
#include <stddef.h>
#include "config.h"
/** MEMALLOC declares the allocators for a class to allocate
* memory in the non-snapshotting heap. */
#define MEMALLOC \
void * operator new(size_t size) { \
return model_malloc(size); \
} \
void operator delete(void *p, size_t size) { \
model_free(p); \
} \
void * operator new[](size_t size) { \
return model_malloc(size); \
} \
void operator delete[](void *p, size_t size) { \
model_free(p); \
} \
void * operator new(size_t size, void *p) { /* placement new */ \
return p; \
}
/** SNAPSHOTALLOC declares the allocators for a class to allocate
* memory in the snapshotting heap. */
#define SNAPSHOTALLOC \
void * operator new(size_t size) { \
return snapshot_malloc(size); \
} \
void operator delete(void *p, size_t size) { \
snapshot_free(p); \
} \
void * operator new[](size_t size) { \
return snapshot_malloc(size); \
} \
void operator delete[](void *p, size_t size) { \
snapshot_free(p); \
} \
void * operator new(size_t size, void *p) { /* placement new */ \
return p; \
}
void *model_malloc(size_t size);
void *model_calloc(size_t count, size_t size);
void model_free(void *ptr);
void * snapshot_malloc(size_t size);
void * snapshot_calloc(size_t count, size_t size);
void * snapshot_realloc(void *ptr, size_t size);
void snapshot_free(void *ptr);
void * Thread_malloc(size_t size);
void Thread_free(void *ptr);
/** @brief Provides a non-snapshotting allocator for use in STL classes.
*
* The code was adapted from a code example from the book The C++
* Standard Library - A Tutorial and Reference by Nicolai M. Josuttis,
* Addison-Wesley, 1999 © Copyright Nicolai M. Josuttis 1999
* Permission to copy, use, modify, sell and distribute this software
* is granted provided this copyright notice appears in all copies.
* This software is provided "as is" without express or implied
* warranty, and with no claim as to its suitability for any purpose.
*/
template <class T>
class ModelAlloc {
public:
// type definitions
typedef T value_type;
typedef T* pointer;
typedef const T* const_pointer;
typedef T& reference;
typedef const T& const_reference;
typedef size_t size_type;
typedef size_t difference_type;
// rebind allocator to type U
template <class U>
struct rebind {
typedef ModelAlloc<U> other;
};
// return address of values
pointer address(reference value) const {
return &value;
}
const_pointer address(const_reference value) const {
return &value;
}
/* constructors and destructor
* - nothing to do because the allocator has no state
*/
ModelAlloc() throw() {
}
ModelAlloc(const ModelAlloc&) throw() {
}
template <class U>
ModelAlloc(const ModelAlloc<U>&) throw() {
}
~ModelAlloc() throw() {
}
// return maximum number of elements that can be allocated
size_type max_size() const throw() {
return std::numeric_limits<size_t>::max() / sizeof(T);
}
// allocate but don't initialize num elements of type T
pointer allocate(size_type num, const void * = 0) {
pointer p = (pointer)model_malloc(num * sizeof(T));
return p;
}
// initialize elements of allocated storage p with value value
void construct(pointer p, const T& value) {
// initialize memory with placement new
new((void*)p)T(value);
}
// destroy elements of initialized storage p
void destroy(pointer p) {
// destroy objects by calling their destructor
p->~T();
}
// deallocate storage p of deleted elements
void deallocate(pointer p, size_type num) {
model_free((void*)p);
}
};
/** Return that all specializations of this allocator are interchangeable. */
template <class T1, class T2>
bool operator ==(const ModelAlloc<T1>&,
const ModelAlloc<T2>&) throw() {
return true;
}
/** Return that all specializations of this allocator are interchangeable. */
template <class T1, class T2>
bool operator!= (const ModelAlloc<T1>&,
const ModelAlloc<T2>&) throw() {
return false;
}
/** @brief Provides a snapshotting allocator for use in STL classes.
*
* The code was adapted from a code example from the book The C++
* Standard Library - A Tutorial and Reference by Nicolai M. Josuttis,
* Addison-Wesley, 1999 © Copyright Nicolai M. Josuttis 1999
* Permission to copy, use, modify, sell and distribute this software
* is granted provided this copyright notice appears in all copies.
* This software is provided "as is" without express or implied
* warranty, and with no claim as to its suitability for any purpose.
*/
template <class T>
class SnapshotAlloc {
public:
// type definitions
typedef T value_type;
typedef T* pointer;
typedef const T* const_pointer;
typedef T& reference;
typedef const T& const_reference;
typedef size_t size_type;
typedef size_t difference_type;
// rebind allocator to type U
template <class U>
struct rebind {
typedef SnapshotAlloc<U> other;
};
// return address of values
pointer address(reference value) const {
return &value;
}
const_pointer address(const_reference value) const {
return &value;
}
/* constructors and destructor
* - nothing to do because the allocator has no state
*/
SnapshotAlloc() throw() {
}
SnapshotAlloc(const SnapshotAlloc&) throw() {
}
template <class U>
SnapshotAlloc(const SnapshotAlloc<U>&) throw() {
}
~SnapshotAlloc() throw() {
}
// return maximum number of elements that can be allocated
size_type max_size() const throw() {
return std::numeric_limits<size_t>::max() / sizeof(T);
}
// allocate but don't initialize num elements of type T
pointer allocate(size_type num, const void * = 0) {
pointer p = (pointer)snapshot_malloc(num * sizeof(T));
return p;
}
// initialize elements of allocated storage p with value value
void construct(pointer p, const T& value) {
// initialize memory with placement new
new((void*)p)T(value);
}
// destroy elements of initialized storage p
void destroy(pointer p) {
// destroy objects by calling their destructor
p->~T();
}
// deallocate storage p of deleted elements
void deallocate(pointer p, size_type num) {
snapshot_free((void*)p);
}
};
/** Return that all specializations of this allocator are interchangeable. */
template <class T1, class T2>
bool operator ==(const SnapshotAlloc<T1>&,
const SnapshotAlloc<T2>&) throw() {
return true;
}
/** Return that all specializations of this allocator are interchangeable. */
template <class T1, class T2>
bool operator!= (const SnapshotAlloc<T1>&,
const SnapshotAlloc<T2>&) throw() {
return false;
}
#ifdef __cplusplus
extern "C" {
#endif
typedef void * mspace;
extern void * mspace_malloc(mspace msp, size_t bytes);
extern void mspace_free(mspace msp, void* mem);
extern void * mspace_realloc(mspace msp, void* mem, size_t newsize);
extern void * mspace_calloc(mspace msp, size_t n_elements, size_t elem_size);
extern mspace create_mspace_with_base(void* base, size_t capacity, int locked);
extern mspace create_mspace(size_t capacity, int locked);
#if USE_MPROTECT_SNAPSHOT
extern mspace user_snapshot_space;
#endif
extern mspace model_snapshot_space;
#ifdef __cplusplus
}; /* end of extern "C" */
#endif
#endif /* _MY_MEMORY_H */