OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. | 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
44 static size_t g_mm_memory_size = TOTAL_MEMORY_TO_ALLOCATE; | 44 static size_t g_mm_memory_size = TOTAL_MEMORY_TO_ALLOCATE; |
45 | 45 |
46 static hmm_descriptor hmm_d; | 46 static hmm_descriptor hmm_d; |
47 static int g_mng_memory_allocated = 0; | 47 static int g_mng_memory_allocated = 0; |
48 | 48 |
49 static int vpx_mm_create_heap_memory(); | 49 static int vpx_mm_create_heap_memory(); |
50 static void *vpx_mm_realloc(void *memblk, size_t size); | 50 static void *vpx_mm_realloc(void *memblk, size_t size); |
51 #endif /*CONFIG_MEM_MANAGER*/ | 51 #endif /*CONFIG_MEM_MANAGER*/ |
52 | 52 |
53 #if USE_GLOBAL_FUNCTION_POINTERS | 53 #if USE_GLOBAL_FUNCTION_POINTERS |
54 struct GLOBAL_FUNC_POINTERS | 54 struct GLOBAL_FUNC_POINTERS { |
55 { | 55 g_malloc_func g_malloc; |
56 g_malloc_func g_malloc; | 56 g_calloc_func g_calloc; |
57 g_calloc_func g_calloc; | 57 g_realloc_func g_realloc; |
58 g_realloc_func g_realloc; | 58 g_free_func g_free; |
59 g_free_func g_free; | 59 g_memcpy_func g_memcpy; |
60 g_memcpy_func g_memcpy; | 60 g_memset_func g_memset; |
61 g_memset_func g_memset; | 61 g_memmove_func g_memmove; |
62 g_memmove_func g_memmove; | |
63 } *g_func = NULL; | 62 } *g_func = NULL; |
64 | 63 |
65 # define VPX_MALLOC_L g_func->g_malloc | 64 # define VPX_MALLOC_L g_func->g_malloc |
66 # define VPX_REALLOC_L g_func->g_realloc | 65 # define VPX_REALLOC_L g_func->g_realloc |
67 # define VPX_FREE_L g_func->g_free | 66 # define VPX_FREE_L g_func->g_free |
68 # define VPX_MEMCPY_L g_func->g_memcpy | 67 # define VPX_MEMCPY_L g_func->g_memcpy |
69 # define VPX_MEMSET_L g_func->g_memset | 68 # define VPX_MEMSET_L g_func->g_memset |
70 # define VPX_MEMMOVE_L g_func->g_memmove | 69 # define VPX_MEMMOVE_L g_func->g_memmove |
71 #else | 70 #else |
72 # define VPX_MALLOC_L malloc | 71 # define VPX_MALLOC_L malloc |
73 # define VPX_REALLOC_L realloc | 72 # define VPX_REALLOC_L realloc |
74 # define VPX_FREE_L free | 73 # define VPX_FREE_L free |
75 # define VPX_MEMCPY_L memcpy | 74 # define VPX_MEMCPY_L memcpy |
76 # define VPX_MEMSET_L memset | 75 # define VPX_MEMSET_L memset |
77 # define VPX_MEMMOVE_L memmove | 76 # define VPX_MEMMOVE_L memmove |
78 #endif /* USE_GLOBAL_FUNCTION_POINTERS */ | 77 #endif /* USE_GLOBAL_FUNCTION_POINTERS */ |
79 | 78 |
80 unsigned int vpx_mem_get_version() | 79 unsigned int vpx_mem_get_version() { |
81 { | 80 unsigned int ver = ((unsigned int)(unsigned char)VPX_MEM_VERSION_CHIEF << 24 | |
82 unsigned int ver = ((unsigned int)(unsigned char)VPX_MEM_VERSION_CHIEF << 24
| | 81 (unsigned int)(unsigned char)VPX_MEM_VERSION_MAJOR << 16 | |
83 (unsigned int)(unsigned char)VPX_MEM_VERSION_MAJOR << 16
| | 82 (unsigned int)(unsigned char)VPX_MEM_VERSION_MINOR << 8 | |
84 (unsigned int)(unsigned char)VPX_MEM_VERSION_MINOR << 8
| | 83 (unsigned int)(unsigned char)VPX_MEM_VERSION_PATCH); |
85 (unsigned int)(unsigned char)VPX_MEM_VERSION_PATCH); | 84 return ver; |
86 return ver; | 85 } |
87 } | 86 |
88 | 87 int vpx_mem_set_heap_size(size_t size) { |
89 int vpx_mem_set_heap_size(size_t size) | 88 int ret = -1; |
90 { | |
91 int ret = -1; | |
92 | 89 |
93 #if CONFIG_MEM_MANAGER | 90 #if CONFIG_MEM_MANAGER |
94 #if MM_DYNAMIC_MEMORY | 91 #if MM_DYNAMIC_MEMORY |
95 | 92 |
96 if (!g_mng_memory_allocated && size) | 93 if (!g_mng_memory_allocated && size) { |
| 94 g_mm_memory_size = size; |
| 95 ret = 0; |
| 96 } else |
| 97 ret = -3; |
| 98 |
| 99 #else |
| 100 ret = -2; |
| 101 #endif |
| 102 #else |
| 103 (void)size; |
| 104 #endif |
| 105 |
| 106 return ret; |
| 107 } |
| 108 |
| 109 void *vpx_memalign(size_t align, size_t size) { |
| 110 void *addr, |
| 111 * x = NULL; |
| 112 |
| 113 #if CONFIG_MEM_MANAGER |
| 114 int number_aau; |
| 115 |
| 116 if (vpx_mm_create_heap_memory() < 0) { |
| 117 _P(printf("[vpx][mm] ERROR vpx_memalign() Couldn't create memory for Heap.\n
");) |
| 118 } |
| 119 |
| 120 number_aau = ((size + align - 1 + ADDRESS_STORAGE_SIZE) >> |
| 121 SHIFT_HMM_ADDR_ALIGN_UNIT) + 1; |
| 122 |
| 123 addr = hmm_alloc(&hmm_d, number_aau); |
| 124 #else |
| 125 addr = VPX_MALLOC_L(size + align - 1 + ADDRESS_STORAGE_SIZE); |
| 126 #endif /*CONFIG_MEM_MANAGER*/ |
| 127 |
| 128 if (addr) { |
| 129 x = align_addr((unsigned char *)addr + ADDRESS_STORAGE_SIZE, (int)align); |
| 130 /* save the actual malloc address */ |
| 131 ((size_t *)x)[-1] = (size_t)addr; |
| 132 } |
| 133 |
| 134 return x; |
| 135 } |
| 136 |
| 137 void *vpx_malloc(size_t size) { |
| 138 return vpx_memalign(DEFAULT_ALIGNMENT, size); |
| 139 } |
| 140 |
| 141 void *vpx_calloc(size_t num, size_t size) { |
| 142 void *x; |
| 143 |
| 144 x = vpx_memalign(DEFAULT_ALIGNMENT, num * size); |
| 145 |
| 146 if (x) |
| 147 VPX_MEMSET_L(x, 0, num * size); |
| 148 |
| 149 return x; |
| 150 } |
| 151 |
| 152 void *vpx_realloc(void *memblk, size_t size) { |
| 153 void *addr, |
| 154 * new_addr = NULL; |
| 155 int align = DEFAULT_ALIGNMENT; |
| 156 |
| 157 /* |
| 158 The realloc() function changes the size of the object pointed to by |
| 159 ptr to the size specified by size, and returns a pointer to the |
| 160 possibly moved block. The contents are unchanged up to the lesser |
| 161 of the new and old sizes. If ptr is null, realloc() behaves like |
| 162 malloc() for the specified size. If size is zero (0) and ptr is |
| 163 not a null pointer, the object pointed to is freed. |
| 164 */ |
| 165 if (!memblk) |
| 166 new_addr = vpx_malloc(size); |
| 167 else if (!size) |
| 168 vpx_free(memblk); |
| 169 else { |
| 170 addr = (void *)(((size_t *)memblk)[-1]); |
| 171 memblk = NULL; |
| 172 |
| 173 #if CONFIG_MEM_MANAGER |
| 174 new_addr = vpx_mm_realloc(addr, size + align + ADDRESS_STORAGE_SIZE); |
| 175 #else |
| 176 new_addr = VPX_REALLOC_L(addr, size + align + ADDRESS_STORAGE_SIZE); |
| 177 #endif |
| 178 |
| 179 if (new_addr) { |
| 180 addr = new_addr; |
| 181 new_addr = (void *)(((size_t) |
| 182 ((unsigned char *)new_addr + ADDRESS_STORAGE_SIZE) +
(align - 1)) & |
| 183 (size_t) - align); |
| 184 /* save the actual malloc address */ |
| 185 ((size_t *)new_addr)[-1] = (size_t)addr; |
| 186 } |
| 187 } |
| 188 |
| 189 return new_addr; |
| 190 } |
| 191 |
| 192 void vpx_free(void *memblk) { |
| 193 if (memblk) { |
| 194 void *addr = (void *)(((size_t *)memblk)[-1]); |
| 195 #if CONFIG_MEM_MANAGER |
| 196 hmm_free(&hmm_d, addr); |
| 197 #else |
| 198 VPX_FREE_L(addr); |
| 199 #endif |
| 200 } |
| 201 } |
| 202 |
| 203 #if CONFIG_MEM_TRACKER |
| 204 void *xvpx_memalign(size_t align, size_t size, char *file, int line) { |
| 205 #if TRY_BOUNDS_CHECK |
| 206 unsigned char *x_bounds; |
| 207 #endif |
| 208 |
| 209 void *x; |
| 210 |
| 211 if (g_alloc_count == 0) { |
| 212 #if TRY_BOUNDS_CHECK |
| 213 int i_rv = vpx_memory_tracker_init(BOUNDS_CHECK_PAD_SIZE, BOUNDS_CHECK_VALUE
); |
| 214 #else |
| 215 int i_rv = vpx_memory_tracker_init(0, 0); |
| 216 #endif |
| 217 |
| 218 if (i_rv < 0) { |
| 219 _P(printf("ERROR xvpx_malloc MEM_TRACK_USAGE error vpx_memory_tracker_init
().\n");) |
| 220 } |
| 221 } |
| 222 |
| 223 #if TRY_BOUNDS_CHECK |
| 224 { |
| 225 int i; |
| 226 unsigned int tempme = BOUNDS_CHECK_VALUE; |
| 227 |
| 228 x_bounds = vpx_memalign(align, size + (BOUNDS_CHECK_PAD_SIZE * 2)); |
| 229 |
| 230 if (x_bounds) { |
| 231 /*we're aligning the address twice here but to keep things |
| 232 consistent we want to have the padding come before the stored |
| 233 address so no matter what free function gets called we will |
| 234 attempt to free the correct address*/ |
| 235 x_bounds = (unsigned char *)(((size_t *)x_bounds)[-1]); |
| 236 x = align_addr(x_bounds + BOUNDS_CHECK_PAD_SIZE + ADDRESS_STORAGE_SIZE, |
| 237 (int)align); |
| 238 /* save the actual malloc address */ |
| 239 ((size_t *)x)[-1] = (size_t)x_bounds; |
| 240 |
| 241 for (i = 0; i < BOUNDS_CHECK_PAD_SIZE; i += sizeof(unsigned int)) { |
| 242 VPX_MEMCPY_L(x_bounds + i, &tempme, sizeof(unsigned int)); |
| 243 VPX_MEMCPY_L((unsigned char *)x + size + i, |
| 244 &tempme, sizeof(unsigned int)); |
| 245 } |
| 246 } else |
| 247 x = NULL; |
| 248 } |
| 249 #else |
| 250 x = vpx_memalign(align, size); |
| 251 #endif /*TRY_BOUNDS_CHECK*/ |
| 252 |
| 253 g_alloc_count++; |
| 254 |
| 255 vpx_memory_tracker_add((size_t)x, (unsigned int)size, file, line, 1); |
| 256 |
| 257 return x; |
| 258 } |
| 259 |
| 260 void *xvpx_malloc(size_t size, char *file, int line) { |
| 261 return xvpx_memalign(DEFAULT_ALIGNMENT, size, file, line); |
| 262 } |
| 263 |
| 264 void *xvpx_calloc(size_t num, size_t size, char *file, int line) { |
| 265 void *x = xvpx_memalign(DEFAULT_ALIGNMENT, num * size, file, line); |
| 266 |
| 267 if (x) |
| 268 VPX_MEMSET_L(x, 0, num * size); |
| 269 |
| 270 return x; |
| 271 } |
| 272 |
| 273 void *xvpx_realloc(void *memblk, size_t size, char *file, int line) { |
| 274 struct mem_block *p = NULL; |
| 275 int orig_size = 0, |
| 276 orig_line = 0; |
| 277 char *orig_file = NULL; |
| 278 |
| 279 #if TRY_BOUNDS_CHECK |
| 280 unsigned char *x_bounds = memblk ? |
| 281 (unsigned char *)(((size_t *)memblk)[-1]) : |
| 282 NULL; |
| 283 #endif |
| 284 |
| 285 void *x; |
| 286 |
| 287 if (g_alloc_count == 0) { |
| 288 #if TRY_BOUNDS_CHECK |
| 289 |
| 290 if (!vpx_memory_tracker_init(BOUNDS_CHECK_PAD_SIZE, BOUNDS_CHECK_VALUE)) |
| 291 #else |
| 292 if (!vpx_memory_tracker_init(0, 0)) |
| 293 #endif |
97 { | 294 { |
98 g_mm_memory_size = size; | 295 _P(printf("ERROR xvpx_malloc MEM_TRACK_USAGE error vpx_memory_tracker_init
().\n");) |
99 ret = 0; | |
100 } | 296 } |
101 else | 297 } |
102 ret = -3; | 298 |
103 | 299 if ((p = vpx_memory_tracker_find((size_t)memblk))) { |
104 #else | 300 orig_size = p->size; |
105 ret = -2; | 301 orig_file = p->file; |
106 #endif | 302 orig_line = p->line; |
107 #else | 303 } |
108 (void)size; | 304 |
109 #endif | 305 #if TRY_BOUNDS_CHECK_ON_FREE |
110 | 306 vpx_memory_tracker_check_integrity(file, line); |
111 return ret; | 307 #endif |
112 } | 308 |
113 | 309 /* have to do this regardless of success, because |
114 void *vpx_memalign(size_t align, size_t size) | 310 * the memory that does get realloc'd may change |
115 { | 311 * the bounds values of this block |
116 void *addr, | 312 */ |
117 * x = NULL; | 313 vpx_memory_tracker_remove((size_t)memblk); |
118 | 314 |
119 #if CONFIG_MEM_MANAGER | 315 #if TRY_BOUNDS_CHECK |
120 int number_aau; | 316 { |
121 | 317 int i; |
122 if (vpx_mm_create_heap_memory() < 0) | 318 unsigned int tempme = BOUNDS_CHECK_VALUE; |
123 { | 319 |
124 _P(printf("[vpx][mm] ERROR vpx_memalign() Couldn't create memory for Hea
p.\n");) | 320 x_bounds = vpx_realloc(memblk, size + (BOUNDS_CHECK_PAD_SIZE * 2)); |
125 } | 321 |
126 | 322 if (x_bounds) { |
127 number_aau = ((size + align - 1 + ADDRESS_STORAGE_SIZE) >> | 323 x_bounds = (unsigned char *)(((size_t *)x_bounds)[-1]); |
128 SHIFT_HMM_ADDR_ALIGN_UNIT) + 1; | 324 x = align_addr(x_bounds + BOUNDS_CHECK_PAD_SIZE + ADDRESS_STORAGE_SIZE, |
129 | 325 (int)DEFAULT_ALIGNMENT); |
130 addr = hmm_alloc(&hmm_d, number_aau); | 326 /* save the actual malloc address */ |
131 #else | 327 ((size_t *)x)[-1] = (size_t)x_bounds; |
132 addr = VPX_MALLOC_L(size + align - 1 + ADDRESS_STORAGE_SIZE); | 328 |
133 #endif /*CONFIG_MEM_MANAGER*/ | 329 for (i = 0; i < BOUNDS_CHECK_PAD_SIZE; i += sizeof(unsigned int)) { |
134 | 330 VPX_MEMCPY_L(x_bounds + i, &tempme, sizeof(unsigned int)); |
135 if (addr) | 331 VPX_MEMCPY_L((unsigned char *)x + size + i, |
136 { | 332 &tempme, sizeof(unsigned int)); |
137 x = align_addr((unsigned char *)addr + ADDRESS_STORAGE_SIZE, (int)align)
; | 333 } |
138 /* save the actual malloc address */ | 334 } else |
139 ((size_t *)x)[-1] = (size_t)addr; | 335 x = NULL; |
140 } | 336 } |
141 | 337 #else |
142 return x; | 338 x = vpx_realloc(memblk, size); |
143 } | |
144 | |
145 void *vpx_malloc(size_t size) | |
146 { | |
147 return vpx_memalign(DEFAULT_ALIGNMENT, size); | |
148 } | |
149 | |
150 void *vpx_calloc(size_t num, size_t size) | |
151 { | |
152 void *x; | |
153 | |
154 x = vpx_memalign(DEFAULT_ALIGNMENT, num * size); | |
155 | |
156 if (x) | |
157 VPX_MEMSET_L(x, 0, num * size); | |
158 | |
159 return x; | |
160 } | |
161 | |
162 void *vpx_realloc(void *memblk, size_t size) | |
163 { | |
164 void *addr, | |
165 * new_addr = NULL; | |
166 int align = DEFAULT_ALIGNMENT; | |
167 | |
168 /* | |
169 The realloc() function changes the size of the object pointed to by | |
170 ptr to the size specified by size, and returns a pointer to the | |
171 possibly moved block. The contents are unchanged up to the lesser | |
172 of the new and old sizes. If ptr is null, realloc() behaves like | |
173 malloc() for the specified size. If size is zero (0) and ptr is | |
174 not a null pointer, the object pointed to is freed. | |
175 */ | |
176 if (!memblk) | |
177 new_addr = vpx_malloc(size); | |
178 else if (!size) | |
179 vpx_free(memblk); | |
180 else | |
181 { | |
182 addr = (void *)(((size_t *)memblk)[-1]); | |
183 memblk = NULL; | |
184 | |
185 #if CONFIG_MEM_MANAGER | |
186 new_addr = vpx_mm_realloc(addr, size + align + ADDRESS_STORAGE_SIZE); | |
187 #else | |
188 new_addr = VPX_REALLOC_L(addr, size + align + ADDRESS_STORAGE_SIZE); | |
189 #endif | |
190 | |
191 if (new_addr) | |
192 { | |
193 addr = new_addr; | |
194 new_addr = (void *)(((size_t) | |
195 ((unsigned char *)new_addr + ADDRESS_STORAGE_SI
ZE) + (align - 1)) & | |
196 (size_t) - align); | |
197 /* save the actual malloc address */ | |
198 ((size_t *)new_addr)[-1] = (size_t)addr; | |
199 } | |
200 } | |
201 | |
202 return new_addr; | |
203 } | |
204 | |
205 void vpx_free(void *memblk) | |
206 { | |
207 if (memblk) | |
208 { | |
209 void *addr = (void *)(((size_t *)memblk)[-1]); | |
210 #if CONFIG_MEM_MANAGER | |
211 hmm_free(&hmm_d, addr); | |
212 #else | |
213 VPX_FREE_L(addr); | |
214 #endif | |
215 } | |
216 } | |
217 | |
218 #if CONFIG_MEM_TRACKER | |
219 void *xvpx_memalign(size_t align, size_t size, char *file, int line) | |
220 { | |
221 #if TRY_BOUNDS_CHECK | |
222 unsigned char *x_bounds; | |
223 #endif | |
224 | |
225 void *x; | |
226 | |
227 if (g_alloc_count == 0) | |
228 { | |
229 #if TRY_BOUNDS_CHECK | |
230 int i_rv = vpx_memory_tracker_init(BOUNDS_CHECK_PAD_SIZE, BOUNDS_CHECK_V
ALUE); | |
231 #else | |
232 int i_rv = vpx_memory_tracker_init(0, 0); | |
233 #endif | |
234 | |
235 if (i_rv < 0) | |
236 { | |
237 _P(printf("ERROR xvpx_malloc MEM_TRACK_USAGE error vpx_memory_tracke
r_init().\n");) | |
238 } | |
239 } | |
240 | |
241 #if TRY_BOUNDS_CHECK | |
242 { | |
243 int i; | |
244 unsigned int tempme = BOUNDS_CHECK_VALUE; | |
245 | |
246 x_bounds = vpx_memalign(align, size + (BOUNDS_CHECK_PAD_SIZE * 2)); | |
247 | |
248 if (x_bounds) | |
249 { | |
250 /*we're aligning the address twice here but to keep things | |
251 consistent we want to have the padding come before the stored | |
252 address so no matter what free function gets called we will | |
253 attempt to free the correct address*/ | |
254 x_bounds = (unsigned char *)(((size_t *)x_bounds)[-1]); | |
255 x = align_addr(x_bounds + BOUNDS_CHECK_PAD_SIZE + ADDRESS_STORAGE_SI
ZE, | |
256 (int)align); | |
257 /* save the actual malloc address */ | |
258 ((size_t *)x)[-1] = (size_t)x_bounds; | |
259 | |
260 for (i = 0; i < BOUNDS_CHECK_PAD_SIZE; i += sizeof(unsigned int)) | |
261 { | |
262 VPX_MEMCPY_L(x_bounds + i, &tempme, sizeof(unsigned int)); | |
263 VPX_MEMCPY_L((unsigned char *)x + size + i, | |
264 &tempme, sizeof(unsigned int)); | |
265 } | |
266 } | |
267 else | |
268 x = NULL; | |
269 } | |
270 #else | |
271 x = vpx_memalign(align, size); | |
272 #endif /*TRY_BOUNDS_CHECK*/ | 339 #endif /*TRY_BOUNDS_CHECK*/ |
273 | 340 |
274 g_alloc_count++; | 341 if (!memblk) ++g_alloc_count; |
275 | 342 |
| 343 if (x) |
276 vpx_memory_tracker_add((size_t)x, (unsigned int)size, file, line, 1); | 344 vpx_memory_tracker_add((size_t)x, (unsigned int)size, file, line, 1); |
277 | 345 else |
278 return x; | 346 vpx_memory_tracker_add((size_t)memblk, orig_size, orig_file, orig_line, 1); |
279 } | 347 |
280 | 348 return x; |
281 void *xvpx_malloc(size_t size, char *file, int line) | 349 } |
282 { | 350 |
283 return xvpx_memalign(DEFAULT_ALIGNMENT, size, file, line); | 351 void xvpx_free(void *p_address, char *file, int line) { |
284 } | 352 #if TRY_BOUNDS_CHECK |
285 | 353 unsigned char *p_bounds_address = (unsigned char *)p_address; |
286 void *xvpx_calloc(size_t num, size_t size, char *file, int line) | 354 /*p_bounds_address -= BOUNDS_CHECK_PAD_SIZE;*/ |
287 { | 355 #endif |
288 void *x = xvpx_memalign(DEFAULT_ALIGNMENT, num * size, file, line); | 356 |
289 | 357 #if !TRY_BOUNDS_CHECK_ON_FREE |
290 if (x) | 358 (void)file; |
291 VPX_MEMSET_L(x, 0, num * size); | 359 (void)line; |
292 | 360 #endif |
293 return x; | 361 |
294 } | 362 if (p_address) { |
295 | |
296 void *xvpx_realloc(void *memblk, size_t size, char *file, int line) | |
297 { | |
298 struct mem_block *p = NULL; | |
299 int orig_size = 0, | |
300 orig_line = 0; | |
301 char *orig_file = NULL; | |
302 | |
303 #if TRY_BOUNDS_CHECK | |
304 unsigned char *x_bounds = memblk ? | |
305 (unsigned char *)(((size_t *)memblk)[-1]) : | |
306 NULL; | |
307 #endif | |
308 | |
309 void *x; | |
310 | |
311 if (g_alloc_count == 0) | |
312 { | |
313 #if TRY_BOUNDS_CHECK | |
314 | |
315 if (!vpx_memory_tracker_init(BOUNDS_CHECK_PAD_SIZE, BOUNDS_CHECK_VALUE)) | |
316 #else | |
317 if (!vpx_memory_tracker_init(0, 0)) | |
318 #endif | |
319 { | |
320 _P(printf("ERROR xvpx_malloc MEM_TRACK_USAGE error vpx_memory_tracke
r_init().\n");) | |
321 } | |
322 } | |
323 | |
324 if ((p = vpx_memory_tracker_find((size_t)memblk))) | |
325 { | |
326 orig_size = p->size; | |
327 orig_file = p->file; | |
328 orig_line = p->line; | |
329 } | |
330 | |
331 #if TRY_BOUNDS_CHECK_ON_FREE | 363 #if TRY_BOUNDS_CHECK_ON_FREE |
332 vpx_memory_tracker_check_integrity(file, line); | 364 vpx_memory_tracker_check_integrity(file, line); |
333 #endif | 365 #endif |
334 | 366 |
335 /* have to do this regardless of success, because | 367 /* if the addr isn't found in the list, assume it was allocated via |
336 * the memory that does get realloc'd may change | 368 * vpx_ calls not xvpx_, therefore it does not contain any padding |
337 * the bounds values of this block | |
338 */ | 369 */ |
339 vpx_memory_tracker_remove((size_t)memblk); | 370 if (vpx_memory_tracker_remove((size_t)p_address) == -2) { |
340 | 371 p_bounds_address = p_address; |
341 #if TRY_BOUNDS_CHECK | 372 _P(fprintf(stderr, "[vpx_mem][xvpx_free] addr: %p not found in" |
342 { | 373 " list; freed from file:%s" |
343 int i; | 374 " line:%d\n", p_address, file, line)); |
344 unsigned int tempme = BOUNDS_CHECK_VALUE; | 375 } else |
345 | 376 --g_alloc_count; |
346 x_bounds = vpx_realloc(memblk, size + (BOUNDS_CHECK_PAD_SIZE * 2)); | 377 |
347 | 378 #if TRY_BOUNDS_CHECK |
348 if (x_bounds) | 379 vpx_free(p_bounds_address); |
349 { | 380 #else |
350 x_bounds = (unsigned char *)(((size_t *)x_bounds)[-1]); | 381 vpx_free(p_address); |
351 x = align_addr(x_bounds + BOUNDS_CHECK_PAD_SIZE + ADDRESS_STORAGE_SI
ZE, | 382 #endif |
352 (int)DEFAULT_ALIGNMENT); | 383 |
353 /* save the actual malloc address */ | 384 if (!g_alloc_count) |
354 ((size_t *)x)[-1] = (size_t)x_bounds; | 385 vpx_memory_tracker_destroy(); |
355 | 386 } |
356 for (i = 0; i < BOUNDS_CHECK_PAD_SIZE; i += sizeof(unsigned int)) | |
357 { | |
358 VPX_MEMCPY_L(x_bounds + i, &tempme, sizeof(unsigned int)); | |
359 VPX_MEMCPY_L((unsigned char *)x + size + i, | |
360 &tempme, sizeof(unsigned int)); | |
361 } | |
362 } | |
363 else | |
364 x = NULL; | |
365 } | |
366 #else | |
367 x = vpx_realloc(memblk, size); | |
368 #endif /*TRY_BOUNDS_CHECK*/ | |
369 | |
370 if (!memblk) ++g_alloc_count; | |
371 | |
372 if (x) | |
373 vpx_memory_tracker_add((size_t)x, (unsigned int)size, file, line, 1); | |
374 else | |
375 vpx_memory_tracker_add((size_t)memblk, orig_size, orig_file, orig_line,
1); | |
376 | |
377 return x; | |
378 } | |
379 | |
380 void xvpx_free(void *p_address, char *file, int line) | |
381 { | |
382 #if TRY_BOUNDS_CHECK | |
383 unsigned char *p_bounds_address = (unsigned char *)p_address; | |
384 /*p_bounds_address -= BOUNDS_CHECK_PAD_SIZE;*/ | |
385 #endif | |
386 | |
387 #if !TRY_BOUNDS_CHECK_ON_FREE | |
388 (void)file; | |
389 (void)line; | |
390 #endif | |
391 | |
392 if (p_address) | |
393 { | |
394 #if TRY_BOUNDS_CHECK_ON_FREE | |
395 vpx_memory_tracker_check_integrity(file, line); | |
396 #endif | |
397 | |
398 /* if the addr isn't found in the list, assume it was allocated via | |
399 * vpx_ calls not xvpx_, therefore it does not contain any padding | |
400 */ | |
401 if (vpx_memory_tracker_remove((size_t)p_address) == -2) | |
402 { | |
403 p_bounds_address = p_address; | |
404 _P(fprintf(stderr, "[vpx_mem][xvpx_free] addr: %p not found in" | |
405 " list; freed from file:%s" | |
406 " line:%d\n", p_address, file, line)); | |
407 } | |
408 else | |
409 --g_alloc_count; | |
410 | |
411 #if TRY_BOUNDS_CHECK | |
412 vpx_free(p_bounds_address); | |
413 #else | |
414 vpx_free(p_address); | |
415 #endif | |
416 | |
417 if (!g_alloc_count) | |
418 vpx_memory_tracker_destroy(); | |
419 } | |
420 } | 387 } |
421 | 388 |
422 #endif /*CONFIG_MEM_TRACKER*/ | 389 #endif /*CONFIG_MEM_TRACKER*/ |
423 | 390 |
424 #if CONFIG_MEM_CHECKS | 391 #if CONFIG_MEM_CHECKS |
425 #if defined(VXWORKS) | 392 #if defined(VXWORKS) |
426 #include <task_lib.h> /*for task_delay()*/ | 393 #include <task_lib.h> /*for task_delay()*/ |
427 /* This function is only used to get a stack trace of the player | 394 /* This function is only used to get a stack trace of the player |
428 object so we can se where we are having a problem. */ | 395 object so we can se where we are having a problem. */ |
429 static int get_my_tt(int task) | 396 static int get_my_tt(int task) { |
430 { | 397 tt(task); |
431 tt(task); | 398 |
432 | 399 return 0; |
433 return 0; | 400 } |
434 } | 401 |
435 | 402 static void vx_sleep(int msec) { |
436 static void vx_sleep(int msec) | 403 int ticks_to_sleep = 0; |
437 { | 404 |
438 int ticks_to_sleep = 0; | 405 if (msec) { |
439 | 406 int msec_per_tick = 1000 / sys_clk_rate_get(); |
440 if (msec) | 407 |
| 408 if (msec < msec_per_tick) |
| 409 ticks_to_sleep++; |
| 410 else |
| 411 ticks_to_sleep = msec / msec_per_tick; |
| 412 } |
| 413 |
| 414 task_delay(ticks_to_sleep); |
| 415 } |
| 416 #endif |
| 417 #endif |
| 418 |
| 419 void *vpx_memcpy(void *dest, const void *source, size_t length) { |
| 420 #if CONFIG_MEM_CHECKS |
| 421 |
| 422 if (((int)dest < 0x4000) || ((int)source < 0x4000)) { |
| 423 _P(printf("WARNING: vpx_memcpy dest:0x%x source:0x%x len:%d\n", (int)dest, (
int)source, length);) |
| 424 |
| 425 #if defined(VXWORKS) |
| 426 sp(get_my_tt, task_id_self(), 0, 0, 0, 0, 0, 0, 0, 0); |
| 427 |
| 428 vx_sleep(10000); |
| 429 #endif |
| 430 } |
| 431 |
| 432 #endif |
| 433 |
| 434 return VPX_MEMCPY_L(dest, source, length); |
| 435 } |
| 436 |
| 437 void *vpx_memset(void *dest, int val, size_t length) { |
| 438 #if CONFIG_MEM_CHECKS |
| 439 |
| 440 if ((int)dest < 0x4000) { |
| 441 _P(printf("WARNING: vpx_memset dest:0x%x val:%d len:%d\n", (int)dest, val, l
ength);) |
| 442 |
| 443 #if defined(VXWORKS) |
| 444 sp(get_my_tt, task_id_self(), 0, 0, 0, 0, 0, 0, 0, 0); |
| 445 |
| 446 vx_sleep(10000); |
| 447 #endif |
| 448 } |
| 449 |
| 450 #endif |
| 451 |
| 452 return VPX_MEMSET_L(dest, val, length); |
| 453 } |
| 454 |
| 455 void *vpx_memmove(void *dest, const void *src, size_t count) { |
| 456 #if CONFIG_MEM_CHECKS |
| 457 |
| 458 if (((int)dest < 0x4000) || ((int)src < 0x4000)) { |
| 459 _P(printf("WARNING: vpx_memmove dest:0x%x src:0x%x count:%d\n", (int)dest, (
int)src, count);) |
| 460 |
| 461 #if defined(VXWORKS) |
| 462 sp(get_my_tt, task_id_self(), 0, 0, 0, 0, 0, 0, 0, 0); |
| 463 |
| 464 vx_sleep(10000); |
| 465 #endif |
| 466 } |
| 467 |
| 468 #endif |
| 469 |
| 470 return VPX_MEMMOVE_L(dest, src, count); |
| 471 } |
| 472 |
| 473 #if CONFIG_MEM_MANAGER |
| 474 |
| 475 static int vpx_mm_create_heap_memory() { |
| 476 int i_rv = 0; |
| 477 |
| 478 if (!g_mng_memory_allocated) { |
| 479 #if MM_DYNAMIC_MEMORY |
| 480 g_p_mng_memory_raw = |
| 481 (unsigned char *)malloc(g_mm_memory_size + HMM_ADDR_ALIGN_UNIT); |
| 482 |
| 483 if (g_p_mng_memory_raw) { |
| 484 g_p_mng_memory = (unsigned char *)((((unsigned int)g_p_mng_memory_raw) + |
| 485 HMM_ADDR_ALIGN_UNIT - 1) & |
| 486 -(int)HMM_ADDR_ALIGN_UNIT); |
| 487 |
| 488 _P(printf("[vpx][mm] total memory size:%d g_p_mng_memory_raw:0x%x g_p_mng_
memory:0x%x\n" |
| 489 , g_mm_memory_size + HMM_ADDR_ALIGN_UNIT |
| 490 , (unsigned int)g_p_mng_memory_raw |
| 491 , (unsigned int)g_p_mng_memory);) |
| 492 } else { |
| 493 _P(printf("[vpx][mm] Couldn't allocate memory:%d for vpx memory manager.\n
" |
| 494 , g_mm_memory_size);) |
| 495 |
| 496 i_rv = -1; |
| 497 } |
| 498 |
| 499 if (g_p_mng_memory) |
| 500 #endif |
441 { | 501 { |
442 int msec_per_tick = 1000 / sys_clk_rate_get(); | 502 int chunk_size = 0; |
443 | 503 |
444 if (msec < msec_per_tick) | 504 g_mng_memory_allocated = 1; |
445 ticks_to_sleep++; | 505 |
446 else | 506 hmm_init(&hmm_d); |
447 ticks_to_sleep = msec / msec_per_tick; | 507 |
448 } | 508 chunk_size = g_mm_memory_size >> SHIFT_HMM_ADDR_ALIGN_UNIT; |
449 | 509 |
450 task_delay(ticks_to_sleep); | 510 chunk_size -= DUMMY_END_BLOCK_BAUS; |
451 } | 511 |
452 #endif | 512 _P(printf("[vpx][mm] memory size:%d for vpx memory manager. g_p_mng_memory
:0x%x chunk_size:%d\n" |
453 #endif | 513 , g_mm_memory_size |
454 | 514 , (unsigned int)g_p_mng_memory |
455 void *vpx_memcpy(void *dest, const void *source, size_t length) | 515 , chunk_size);) |
456 { | 516 |
457 #if CONFIG_MEM_CHECKS | 517 hmm_new_chunk(&hmm_d, (void *)g_p_mng_memory, chunk_size); |
458 | 518 } |
459 if (((int)dest < 0x4000) || ((int)source < 0x4000)) | 519 |
460 { | 520 #if MM_DYNAMIC_MEMORY |
461 _P(printf("WARNING: vpx_memcpy dest:0x%x source:0x%x len:%d\n", (int)des
t, (int)source, length);) | 521 else { |
462 | 522 _P(printf("[vpx][mm] Couldn't allocate memory:%d for vpx memory manager.\n
" |
463 #if defined(VXWORKS) | 523 , g_mm_memory_size);) |
464 sp(get_my_tt, task_id_self(), 0, 0, 0, 0, 0, 0, 0, 0); | 524 |
465 | 525 i_rv = -1; |
466 vx_sleep(10000); | 526 } |
467 #endif | 527 |
468 } | 528 #endif |
469 | 529 } |
470 #endif | 530 |
471 | 531 return i_rv; |
472 return VPX_MEMCPY_L(dest, source, length); | 532 } |
473 } | 533 |
474 | 534 static void *vpx_mm_realloc(void *memblk, size_t size) { |
475 void *vpx_memset(void *dest, int val, size_t length) | 535 void *p_ret = NULL; |
476 { | 536 |
477 #if CONFIG_MEM_CHECKS | 537 if (vpx_mm_create_heap_memory() < 0) { |
478 | 538 _P(printf("[vpx][mm] ERROR vpx_mm_realloc() Couldn't create memory for Heap.
\n");) |
479 if ((int)dest < 0x4000) | 539 } else { |
480 { | |
481 _P(printf("WARNING: vpx_memset dest:0x%x val:%d len:%d\n", (int)dest, va
l, length);) | |
482 | |
483 #if defined(VXWORKS) | |
484 sp(get_my_tt, task_id_self(), 0, 0, 0, 0, 0, 0, 0, 0); | |
485 | |
486 vx_sleep(10000); | |
487 #endif | |
488 } | |
489 | |
490 #endif | |
491 | |
492 return VPX_MEMSET_L(dest, val, length); | |
493 } | |
494 | |
495 void *vpx_memmove(void *dest, const void *src, size_t count) | |
496 { | |
497 #if CONFIG_MEM_CHECKS | |
498 | |
499 if (((int)dest < 0x4000) || ((int)src < 0x4000)) | |
500 { | |
501 _P(printf("WARNING: vpx_memmove dest:0x%x src:0x%x count:%d\n", (int)des
t, (int)src, count);) | |
502 | |
503 #if defined(VXWORKS) | |
504 sp(get_my_tt, task_id_self(), 0, 0, 0, 0, 0, 0, 0, 0); | |
505 | |
506 vx_sleep(10000); | |
507 #endif | |
508 } | |
509 | |
510 #endif | |
511 | |
512 return VPX_MEMMOVE_L(dest, src, count); | |
513 } | |
514 | |
515 #if CONFIG_MEM_MANAGER | |
516 | |
517 static int vpx_mm_create_heap_memory() | |
518 { | |
519 int i_rv = 0; | 540 int i_rv = 0; |
520 | 541 int old_num_aaus; |
521 if (!g_mng_memory_allocated) | 542 int new_num_aaus; |
522 { | 543 |
523 #if MM_DYNAMIC_MEMORY | 544 old_num_aaus = hmm_true_size(memblk); |
524 g_p_mng_memory_raw = | 545 new_num_aaus = (size >> SHIFT_HMM_ADDR_ALIGN_UNIT) + 1; |
525 (unsigned char *)malloc(g_mm_memory_size + HMM_ADDR_ALIGN_UNIT); | 546 |
526 | 547 if (old_num_aaus == new_num_aaus) { |
527 if (g_p_mng_memory_raw) | 548 p_ret = memblk; |
528 { | 549 } else { |
529 g_p_mng_memory = (unsigned char *)((((unsigned int)g_p_mng_memory_ra
w) + | 550 i_rv = hmm_resize(&hmm_d, memblk, new_num_aaus); |
530 HMM_ADDR_ALIGN_UNIT - 1) & | 551 |
531 -(int)HMM_ADDR_ALIGN_UNIT); | 552 if (i_rv == 0) { |
532 | 553 p_ret = memblk; |
533 _P(printf("[vpx][mm] total memory size:%d g_p_mng_memory_raw:0x%x g_
p_mng_memory:0x%x\n" | 554 } else { |
534 , g_mm_memory_size + HMM_ADDR_ALIGN_UNIT | 555 /* Error. Try to malloc and then copy data. */ |
535 , (unsigned int)g_p_mng_memory_raw | 556 void *p_from_malloc; |
536 , (unsigned int)g_p_mng_memory);) | 557 |
| 558 new_num_aaus = (size >> SHIFT_HMM_ADDR_ALIGN_UNIT) + 1; |
| 559 p_from_malloc = hmm_alloc(&hmm_d, new_num_aaus); |
| 560 |
| 561 if (p_from_malloc) { |
| 562 vpx_memcpy(p_from_malloc, memblk, size); |
| 563 hmm_free(&hmm_d, memblk); |
| 564 |
| 565 p_ret = p_from_malloc; |
537 } | 566 } |
538 else | 567 } |
539 { | 568 } |
540 _P(printf("[vpx][mm] Couldn't allocate memory:%d for vpx memory mana
ger.\n" | 569 } |
541 , g_mm_memory_size);) | 570 |
542 | 571 return p_ret; |
543 i_rv = -1; | |
544 } | |
545 | |
546 if (g_p_mng_memory) | |
547 #endif | |
548 { | |
549 int chunk_size = 0; | |
550 | |
551 g_mng_memory_allocated = 1; | |
552 | |
553 hmm_init(&hmm_d); | |
554 | |
555 chunk_size = g_mm_memory_size >> SHIFT_HMM_ADDR_ALIGN_UNIT; | |
556 | |
557 chunk_size -= DUMMY_END_BLOCK_BAUS; | |
558 | |
559 _P(printf("[vpx][mm] memory size:%d for vpx memory manager. g_p_mng_
memory:0x%x chunk_size:%d\n" | |
560 , g_mm_memory_size | |
561 , (unsigned int)g_p_mng_memory | |
562 , chunk_size);) | |
563 | |
564 hmm_new_chunk(&hmm_d, (void *)g_p_mng_memory, chunk_size); | |
565 } | |
566 | |
567 #if MM_DYNAMIC_MEMORY | |
568 else | |
569 { | |
570 _P(printf("[vpx][mm] Couldn't allocate memory:%d for vpx memory mana
ger.\n" | |
571 , g_mm_memory_size);) | |
572 | |
573 i_rv = -1; | |
574 } | |
575 | |
576 #endif | |
577 } | |
578 | |
579 return i_rv; | |
580 } | |
581 | |
582 static void *vpx_mm_realloc(void *memblk, size_t size) | |
583 { | |
584 void *p_ret = NULL; | |
585 | |
586 if (vpx_mm_create_heap_memory() < 0) | |
587 { | |
588 _P(printf("[vpx][mm] ERROR vpx_mm_realloc() Couldn't create memory for H
eap.\n");) | |
589 } | |
590 else | |
591 { | |
592 int i_rv = 0; | |
593 int old_num_aaus; | |
594 int new_num_aaus; | |
595 | |
596 old_num_aaus = hmm_true_size(memblk); | |
597 new_num_aaus = (size >> SHIFT_HMM_ADDR_ALIGN_UNIT) + 1; | |
598 | |
599 if (old_num_aaus == new_num_aaus) | |
600 { | |
601 p_ret = memblk; | |
602 } | |
603 else | |
604 { | |
605 i_rv = hmm_resize(&hmm_d, memblk, new_num_aaus); | |
606 | |
607 if (i_rv == 0) | |
608 { | |
609 p_ret = memblk; | |
610 } | |
611 else | |
612 { | |
613 /* Error. Try to malloc and then copy data. */ | |
614 void *p_from_malloc; | |
615 | |
616 new_num_aaus = (size >> SHIFT_HMM_ADDR_ALIGN_UNIT) + 1; | |
617 p_from_malloc = hmm_alloc(&hmm_d, new_num_aaus); | |
618 | |
619 if (p_from_malloc) | |
620 { | |
621 vpx_memcpy(p_from_malloc, memblk, size); | |
622 hmm_free(&hmm_d, memblk); | |
623 | |
624 p_ret = p_from_malloc; | |
625 } | |
626 } | |
627 } | |
628 } | |
629 | |
630 return p_ret; | |
631 } | 572 } |
632 #endif /*CONFIG_MEM_MANAGER*/ | 573 #endif /*CONFIG_MEM_MANAGER*/ |
633 | 574 |
634 #if USE_GLOBAL_FUNCTION_POINTERS | 575 #if USE_GLOBAL_FUNCTION_POINTERS |
635 # if CONFIG_MEM_TRACKER | 576 # if CONFIG_MEM_TRACKER |
636 extern int vpx_memory_tracker_set_functions(g_malloc_func g_malloc_l | 577 extern int vpx_memory_tracker_set_functions(g_malloc_func g_malloc_l |
637 , g_calloc_func g_calloc_l | 578 , g_calloc_func g_calloc_l |
638 , g_realloc_func g_realloc_l | 579 , g_realloc_func g_realloc_l |
639 , g_free_func g_free_l | 580 , g_free_func g_free_l |
640 , g_memcpy_func g_memcpy_l | 581 , g_memcpy_func g_memcpy_l |
641 , g_memset_func g_memset_l | 582 , g_memset_func g_memset_l |
642 , g_memmove_func g_memmove_l); | 583 , g_memmove_func g_memmove_l); |
643 # endif | 584 # endif |
644 #endif /*USE_GLOBAL_FUNCTION_POINTERS*/ | 585 #endif /*USE_GLOBAL_FUNCTION_POINTERS*/ |
645 int vpx_mem_set_functions(g_malloc_func g_malloc_l | 586 int vpx_mem_set_functions(g_malloc_func g_malloc_l |
646 , g_calloc_func g_calloc_l | 587 , g_calloc_func g_calloc_l |
647 , g_realloc_func g_realloc_l | 588 , g_realloc_func g_realloc_l |
648 , g_free_func g_free_l | 589 , g_free_func g_free_l |
649 , g_memcpy_func g_memcpy_l | 590 , g_memcpy_func g_memcpy_l |
650 , g_memset_func g_memset_l | 591 , g_memset_func g_memset_l |
651 , g_memmove_func g_memmove_l) | 592 , g_memmove_func g_memmove_l) { |
652 { | |
653 #if USE_GLOBAL_FUNCTION_POINTERS | 593 #if USE_GLOBAL_FUNCTION_POINTERS |
654 | 594 |
655 /* If use global functions is turned on then the | 595 /* If use global functions is turned on then the |
656 application must set the global functions before | 596 application must set the global functions before |
657 it does anything else or vpx_mem will have | 597 it does anything else or vpx_mem will have |
658 unpredictable results. */ | 598 unpredictable results. */ |
659 if (!g_func) | 599 if (!g_func) { |
660 { | 600 g_func = (struct GLOBAL_FUNC_POINTERS *) |
661 g_func = (struct GLOBAL_FUNC_POINTERS *) | 601 g_malloc_l(sizeof(struct GLOBAL_FUNC_POINTERS)); |
662 g_malloc_l(sizeof(struct GLOBAL_FUNC_POINTERS)); | 602 |
663 | 603 if (!g_func) { |
664 if (!g_func) | 604 return -1; |
665 { | 605 } |
666 return -1; | 606 } |
667 } | |
668 } | |
669 | 607 |
670 #if CONFIG_MEM_TRACKER | 608 #if CONFIG_MEM_TRACKER |
671 { | 609 { |
672 int rv = 0; | 610 int rv = 0; |
673 rv = vpx_memory_tracker_set_functions(g_malloc_l | 611 rv = vpx_memory_tracker_set_functions(g_malloc_l |
674 , g_calloc_l | 612 , g_calloc_l |
675 , g_realloc_l | 613 , g_realloc_l |
676 , g_free_l | 614 , g_free_l |
677 , g_memcpy_l | 615 , g_memcpy_l |
678 , g_memset_l | 616 , g_memset_l |
679 , g_memmove_l); | 617 , g_memmove_l); |
680 | 618 |
681 if (rv < 0) | 619 if (rv < 0) { |
682 { | 620 return rv; |
683 return rv; | 621 } |
684 } | 622 } |
685 } | 623 #endif |
686 #endif | 624 |
687 | 625 g_func->g_malloc = g_malloc_l; |
688 g_func->g_malloc = g_malloc_l; | 626 g_func->g_calloc = g_calloc_l; |
689 g_func->g_calloc = g_calloc_l; | 627 g_func->g_realloc = g_realloc_l; |
690 g_func->g_realloc = g_realloc_l; | 628 g_func->g_free = g_free_l; |
691 g_func->g_free = g_free_l; | 629 g_func->g_memcpy = g_memcpy_l; |
692 g_func->g_memcpy = g_memcpy_l; | 630 g_func->g_memset = g_memset_l; |
693 g_func->g_memset = g_memset_l; | 631 g_func->g_memmove = g_memmove_l; |
694 g_func->g_memmove = g_memmove_l; | 632 |
695 | 633 return 0; |
696 return 0; | |
697 #else | 634 #else |
698 (void)g_malloc_l; | 635 (void)g_malloc_l; |
699 (void)g_calloc_l; | 636 (void)g_calloc_l; |
700 (void)g_realloc_l; | 637 (void)g_realloc_l; |
701 (void)g_free_l; | 638 (void)g_free_l; |
702 (void)g_memcpy_l; | 639 (void)g_memcpy_l; |
703 (void)g_memset_l; | 640 (void)g_memset_l; |
704 (void)g_memmove_l; | 641 (void)g_memmove_l; |
705 return -1; | 642 return -1; |
706 #endif | 643 #endif |
707 } | 644 } |
708 | 645 |
709 int vpx_mem_unset_functions() | 646 int vpx_mem_unset_functions() { |
710 { | |
711 #if USE_GLOBAL_FUNCTION_POINTERS | 647 #if USE_GLOBAL_FUNCTION_POINTERS |
712 | 648 |
713 if (g_func) | 649 if (g_func) { |
714 { | 650 g_free_func temp_free = g_func->g_free; |
715 g_free_func temp_free = g_func->g_free; | 651 temp_free(g_func); |
716 temp_free(g_func); | 652 g_func = NULL; |
717 g_func = NULL; | 653 } |
718 } | 654 |
719 | 655 #endif |
720 #endif | 656 return 0; |
721 return 0; | 657 } |
722 } | |
OLD | NEW |