block_Realloc: waste handling only if not reallocating
authorRémi Denis-Courmont <remi@remlab.net>
Sun, 30 Aug 2009 13:12:09 +0000 (16:12 +0300)
committerRémi Denis-Courmont <remi@remlab.net>
Sun, 30 Aug 2009 13:26:45 +0000 (16:26 +0300)
src/misc/block.c

index 6cefb24..339c5a5 100644 (file)
@@ -207,6 +207,24 @@ block_t *block_Realloc( block_t *p_block, ssize_t i_prebody, size_t i_body )
         block_Release( p_block );
         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 */
 
     /* Third, expand payload */
@@ -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 */
     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;
 }