|
@@ -245,7 +245,8 @@ void * alloc_memblock ( size_t size, size_t align, size_t offset ) {
|
245
|
245
|
size = ( size + MIN_MEMBLOCK_SIZE - 1 ) & ~( MIN_MEMBLOCK_SIZE - 1 );
|
246
|
246
|
align_mask = ( align - 1 ) | ( MIN_MEMBLOCK_SIZE - 1 );
|
247
|
247
|
|
248
|
|
- DBG ( "Allocating %#zx (aligned %#zx+%zx)\n", size, align, offset );
|
|
248
|
+ DBGC2 ( &heap, "Allocating %#zx (aligned %#zx+%zx)\n",
|
|
249
|
+ size, align, offset );
|
249
|
250
|
while ( 1 ) {
|
250
|
251
|
/* Search through blocks for the first one with enough space */
|
251
|
252
|
list_for_each_entry ( block, &free_blocks, list ) {
|
|
@@ -261,10 +262,10 @@ void * alloc_memblock ( size_t size, size_t align, size_t offset ) {
|
261
|
262
|
pre = block;
|
262
|
263
|
block = ( ( ( void * ) pre ) + pre_size );
|
263
|
264
|
post = ( ( ( void * ) block ) + size );
|
264
|
|
- DBG ( "[%p,%p) -> [%p,%p) + [%p,%p)\n", pre,
|
265
|
|
- ( ( ( void * ) pre ) + pre->size ),
|
266
|
|
- pre, block, post,
|
267
|
|
- ( ( ( void * ) pre ) + pre->size ) );
|
|
265
|
+ DBGC2 ( &heap, "[%p,%p) -> [%p,%p) + [%p,%p)\n",
|
|
266
|
+ pre, ( ( ( void * ) pre ) + pre->size ),
|
|
267
|
+ pre, block, post,
|
|
268
|
+ ( ( ( void * ) pre ) + pre->size ) );
|
268
|
269
|
/* If there is a "post" block, add it in to
|
269
|
270
|
* the free list. Leak it if it is too small
|
270
|
271
|
* (which can happen only at the very end of
|
|
@@ -291,8 +292,8 @@ void * alloc_memblock ( size_t size, size_t align, size_t offset ) {
|
291
|
292
|
/* Update total free memory */
|
292
|
293
|
freemem -= size;
|
293
|
294
|
/* Return allocated block */
|
294
|
|
- DBG ( "Allocated [%p,%p)\n", block,
|
295
|
|
- ( ( ( void * ) block ) + size ) );
|
|
295
|
+ DBGC2 ( &heap, "Allocated [%p,%p)\n", block,
|
|
296
|
+ ( ( ( void * ) block ) + size ) );
|
296
|
297
|
ptr = block;
|
297
|
298
|
goto done;
|
298
|
299
|
}
|
|
@@ -301,8 +302,8 @@ void * alloc_memblock ( size_t size, size_t align, size_t offset ) {
|
301
|
302
|
/* Try discarding some cached data to free up memory */
|
302
|
303
|
if ( ! discard_cache() ) {
|
303
|
304
|
/* Nothing available to discard */
|
304
|
|
- DBG ( "Failed to allocate %#zx (aligned %#zx)\n",
|
305
|
|
- size, align );
|
|
305
|
+ DBGC ( &heap, "Failed to allocate %#zx (aligned "
|
|
306
|
+ "%#zx)\n", size, align );
|
306
|
307
|
ptr = NULL;
|
307
|
308
|
goto done;
|
308
|
309
|
}
|
|
@@ -341,7 +342,8 @@ void free_memblock ( void *ptr, size_t size ) {
|
341
|
342
|
freeing = ptr;
|
342
|
343
|
VALGRIND_MAKE_MEM_DEFINED ( freeing, sizeof ( *freeing ) );
|
343
|
344
|
freeing->size = size;
|
344
|
|
- DBG ( "Freeing [%p,%p)\n", freeing, ( ( ( void * ) freeing ) + size ));
|
|
345
|
+ DBGC2 ( &heap, "Freeing [%p,%p)\n",
|
|
346
|
+ freeing, ( ( ( void * ) freeing ) + size ) );
|
345
|
347
|
|
346
|
348
|
/* Insert/merge into free list */
|
347
|
349
|
list_for_each_entry_safe ( block, tmp, &free_blocks, list ) {
|
|
@@ -352,10 +354,11 @@ void free_memblock ( void *ptr, size_t size ) {
|
352
|
354
|
( ( ( void * ) freeing ) + freeing->size ) );
|
353
|
355
|
/* Merge with immediately preceding block, if possible */
|
354
|
356
|
if ( gap_before == 0 ) {
|
355
|
|
- DBG ( "[%p,%p) + [%p,%p) -> [%p,%p)\n", block,
|
356
|
|
- ( ( ( void * ) block ) + block->size ), freeing,
|
357
|
|
- ( ( ( void * ) freeing ) + freeing->size ),block,
|
358
|
|
- ( ( ( void * ) freeing ) + freeing->size ) );
|
|
357
|
+ DBGC2 ( &heap, "[%p,%p) + [%p,%p) -> [%p,%p)\n", block,
|
|
358
|
+ ( ( ( void * ) block ) + block->size ), freeing,
|
|
359
|
+ ( ( ( void * ) freeing ) + freeing->size ),
|
|
360
|
+ block,
|
|
361
|
+ ( ( ( void * ) freeing ) + freeing->size ) );
|
359
|
362
|
block->size += size;
|
360
|
363
|
list_del ( &block->list );
|
361
|
364
|
freeing = block;
|
|
@@ -369,13 +372,14 @@ void free_memblock ( void *ptr, size_t size ) {
|
369
|
372
|
* possible, merge the following block into the "freeing"
|
370
|
373
|
* block.
|
371
|
374
|
*/
|
372
|
|
- DBG ( "[%p,%p)\n", freeing, ( ( ( void * ) freeing ) + freeing->size));
|
|
375
|
+ DBGC2 ( &heap, "[%p,%p)\n",
|
|
376
|
+ freeing, ( ( ( void * ) freeing ) + freeing->size ) );
|
373
|
377
|
list_add_tail ( &freeing->list, &block->list );
|
374
|
378
|
if ( gap_after == 0 ) {
|
375
|
|
- DBG ( "[%p,%p) + [%p,%p) -> [%p,%p)\n", freeing,
|
376
|
|
- ( ( ( void * ) freeing ) + freeing->size ), block,
|
377
|
|
- ( ( ( void * ) block ) + block->size ), freeing,
|
378
|
|
- ( ( ( void * ) block ) + block->size ) );
|
|
379
|
+ DBGC2 ( &heap, "[%p,%p) + [%p,%p) -> [%p,%p)\n", freeing,
|
|
380
|
+ ( ( ( void * ) freeing ) + freeing->size ), block,
|
|
381
|
+ ( ( ( void * ) block ) + block->size ), freeing,
|
|
382
|
+ ( ( ( void * ) block ) + block->size ) );
|
379
|
383
|
freeing->size += block->size;
|
380
|
384
|
list_del ( &block->list );
|
381
|
385
|
}
|