Commit 7df1a17b authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

block_Realloc: waste handling only if not reallocating

parent 9322f709
...@@ -207,6 +207,24 @@ block_t *block_Realloc( block_t *p_block, ssize_t i_prebody, size_t i_body ) ...@@ -207,6 +207,24 @@ block_t *block_Realloc( block_t *p_block, ssize_t i_prebody, size_t i_body )
block_Release( p_block ); block_Release( p_block );
p_block = p_rea; p_block = p_rea;
} }
else
/* We have a very large reserved footer now? Release some of it.
* XXX it might not preserve the alignment of p_buffer */
if( p_end - (p_block->p_buffer + i_body) > BLOCK_WASTE_SIZE )
{
const ptrdiff_t i_prebody = p_block->p_buffer - p_start;
const size_t i_new = requested + 1 * BLOCK_PADDING_SIZE;
block_sys_t *p_new = realloc( p_sys, sizeof (*p_sys) + i_new );
if( p_new != NULL )
{
p_sys = p_new;
p_sys->i_allocated_buffer = i_new;
p_block = &p_sys->self;
p_block->p_buffer = &p_sys->p_allocated_buffer[i_prebody];
}
}
/* NOTE: p_start and p_end are corrupted from this point */ /* NOTE: p_start and p_end are corrupted from this point */
/* Third, expand payload */ /* Third, expand payload */
...@@ -223,23 +241,6 @@ block_t *block_Realloc( block_t *p_block, ssize_t i_prebody, size_t i_body ) ...@@ -223,23 +241,6 @@ block_t *block_Realloc( block_t *p_block, ssize_t i_prebody, size_t i_body )
/* Expand payload to requested size */ /* Expand payload to requested size */
p_block->i_buffer = i_body; p_block->i_buffer = i_body;
/* We have a very large reserved footer now? Release some of it.
* XXX it might not preserve the alignment of p_buffer */
if( (p_sys->p_allocated_buffer + p_sys->i_allocated_buffer) -
(p_block->p_buffer + p_block->i_buffer) > BLOCK_WASTE_SIZE )
{
const ptrdiff_t i_prebody = p_block->p_buffer - p_sys->p_allocated_buffer;
const size_t i_new = i_prebody + p_block->i_buffer + 1 * BLOCK_PADDING_SIZE;
block_sys_t *p_new = realloc( p_sys, sizeof (*p_sys) + i_new );
if( p_new != NULL )
{
p_sys = p_new;
p_sys->i_allocated_buffer = i_new;
p_block = &p_sys->self;
p_block->p_buffer = &p_sys->p_allocated_buffer[i_prebody];
}
}
return p_block; return p_block;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment