Splitting free block from end if block search direction is backward (currently, for short-term blocks).

This commit is contained in:
Ruben Ayrapetyan
2014-11-24 18:47:48 +03:00
parent 5b8077b976
commit 9a0081b856
+30
View File
@@ -475,6 +475,35 @@ mem_heap_alloc_block (size_t size_in_bytes, /**< size of region to all
{ {
MEM_HEAP_STAT_FREE_BLOCK_SPLIT (); MEM_HEAP_STAT_FREE_BLOCK_SPLIT ();
if (direction == MEM_DIRECTION_PREV)
{
prev_block_p = block_p;
uint8_t *block_end_p = (uint8_t*) block_p + found_block_size_in_chunks * MEM_HEAP_CHUNK_SIZE;
block_p = (mem_block_header_t*) (block_end_p - new_block_size_in_chunks * MEM_HEAP_CHUNK_SIZE);
VALGRIND_DEFINED_STRUCT(prev_block_p);
prev_block_p->neighbours[ MEM_DIRECTION_NEXT ] = mem_get_block_neighbour_field (prev_block_p,
block_p);
VALGRIND_NOACCESS_STRUCT(prev_block_p);
if (next_block_p == NULL)
{
mem_heap.last_block_p = block_p;
}
else
{
VALGRIND_DEFINED_STRUCT(next_block_p);
next_block_p->neighbours[ MEM_DIRECTION_PREV ] = mem_get_block_neighbour_field (block_p,
next_block_p);
VALGRIND_NOACCESS_STRUCT(next_block_p);
}
}
else
{
uint8_t *new_free_block_first_chunk_p = (uint8_t*) block_p + new_block_size_in_chunks * MEM_HEAP_CHUNK_SIZE; uint8_t *new_free_block_first_chunk_p = (uint8_t*) block_p + new_block_size_in_chunks * MEM_HEAP_CHUNK_SIZE;
mem_init_block_header (new_free_block_first_chunk_p, mem_init_block_header (new_free_block_first_chunk_p,
0, 0,
@@ -501,6 +530,7 @@ mem_heap_alloc_block (size_t size_in_bytes, /**< size of region to all
next_block_p = new_free_block_p; next_block_p = new_free_block_p;
} }
}
mem_init_block_header ((uint8_t*) block_p, mem_init_block_header ((uint8_t*) block_p,
size_in_bytes, size_in_bytes,