Rémi Bernon : ntdll: Cleanup and rename HEAP_CreateFreeBlock to create_free_block.
Alexandre Julliard
julliard at winehq.org
Mon May 23 15:51:52 CDT 2022
Module: wine
Branch: master
Commit: 2db2c94d127e9f8879642484138270872ab35deb
URL: https://source.winehq.org/git/wine.git/?a=commit;h=2db2c94d127e9f8879642484138270872ab35deb
Author: Rémi Bernon <rbernon at codeweavers.com>
Date: Sat May 21 08:34:14 2022 +0200
ntdll: Cleanup and rename HEAP_CreateFreeBlock to create_free_block.
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
dlls/ntdll/heap.c | 70 +++++++++++++++++++++++--------------------------------
1 file changed, 29 insertions(+), 41 deletions(-)
diff --git a/dlls/ntdll/heap.c b/dlls/ntdll/heap.c
index 302e6cc75ee..0983dc9d2b4 100644
--- a/dlls/ntdll/heap.c
+++ b/dlls/ntdll/heap.c
@@ -676,58 +676,47 @@ static inline BOOL HEAP_Decommit( SUBHEAP *subheap, void *ptr )
}
-/***********************************************************************
- * HEAP_CreateFreeBlock
- *
- * Create a free block at a specified address. 'size' is the size of the
- * whole block, including the new arena.
- */
-static void HEAP_CreateFreeBlock( SUBHEAP *subheap, void *ptr, SIZE_T size )
+static void create_free_block( SUBHEAP *subheap, struct block *block, SIZE_T block_size )
{
- ARENA_FREE *pFree;
- char *pEnd;
+ struct entry *entry = (struct entry *)block;
+ HEAP *heap = subheap->heap;
+ DWORD flags = heap->flags;
+ char *end;
BOOL last;
- DWORD flags = subheap->heap->flags;
- /* Create a free arena */
- mark_block_uninitialized( ptr, sizeof(ARENA_FREE) );
- pFree = ptr;
- pFree->magic = ARENA_FREE_MAGIC;
+ mark_block_uninitialized( block, sizeof(*entry) );
+ entry->magic = ARENA_FREE_MAGIC;
/* If debugging, erase the freed block content */
- pEnd = (char *)ptr + size;
- if (pEnd > (char *)subheap->base + subheap->commitSize)
- pEnd = (char *)subheap->base + subheap->commitSize;
- if (pEnd > (char *)(pFree + 1)) mark_block_free( pFree + 1, pEnd - (char *)(pFree + 1), flags );
+ end = (char *)block + block_size;
+ if (end > (char *)subheap->base + subheap->commitSize)
+ end = (char *)subheap->base + subheap->commitSize;
+ if (end > (char *)(entry + 1)) mark_block_free( entry + 1, end - (char *)(entry + 1), flags );
- /* Check if next block is free also */
-
- if (((char *)ptr + size < (char *)subheap->base + subheap->size) &&
- (*(DWORD *)((char *)ptr + size) & ARENA_FLAG_FREE))
+ if (((char *)block + block_size < (char *)subheap->base + subheap->size) &&
+ (*(DWORD *)((char *)block + block_size) & ARENA_FLAG_FREE))
{
- /* Remove the next arena from the free list */
- ARENA_FREE *pNext = (ARENA_FREE *)((char *)ptr + size);
- list_remove( &pNext->entry );
- size += (pNext->size & ARENA_SIZE_MASK) + sizeof(*pNext);
- mark_block_free( pNext, sizeof(ARENA_FREE), flags );
+ /* merge with the next block if it is free */
+ struct entry *next_entry = (struct entry *)((char *)block + block_size);
+ list_remove( &next_entry->entry );
+ block_size += (next_entry->size & ARENA_SIZE_MASK) + sizeof(*next_entry);
+ mark_block_free( next_entry, sizeof(struct entry), flags );
}
- /* Set the next block PREV_FREE flag and pointer */
- last = ((char *)ptr + size >= (char *)subheap->base + subheap->size);
+ last = ((char *)block + block_size >= (char *)subheap->base + subheap->size);
if (!last)
{
- DWORD *pNext = (DWORD *)((char *)ptr + size);
- *pNext |= ARENA_FLAG_PREV_FREE;
- mark_block_initialized( (ARENA_FREE **)pNext - 1, sizeof( ARENA_FREE * ) );
- *((ARENA_FREE **)pNext - 1) = pFree;
+ /* set the next block PREV_FREE flag and back pointer */
+ DWORD *next = (DWORD *)((char *)block + block_size);
+ *next |= ARENA_FLAG_PREV_FREE;
+ mark_block_initialized( (struct block **)next - 1, sizeof(struct block *) );
+ *((struct block **)next - 1) = block;
}
- /* Last, insert the new block into the free list */
-
- pFree->size = (size - sizeof(*pFree)) | ARENA_FLAG_FREE;
- HEAP_InsertFreeBlock( subheap->heap, pFree, last );
+ entry->size = (block_size - sizeof(*entry)) | ARENA_FLAG_FREE;
+ HEAP_InsertFreeBlock( subheap->heap, entry, last );
}
@@ -769,7 +758,7 @@ static void HEAP_MakeInUseBlockFree( SUBHEAP *subheap, ARENA_INUSE *pArena )
/* Create a free block */
- HEAP_CreateFreeBlock( subheap, pFree, size );
+ create_free_block( subheap, (struct block *)pFree, size );
size = (pFree->size & ARENA_SIZE_MASK) + sizeof(ARENA_FREE);
if ((char *)pFree + size < (char *)subheap->base + subheap->size)
return; /* Not the last block, so nothing more to do */
@@ -805,7 +794,7 @@ static void shrink_used_block( SUBHEAP *subheap, struct block *block, SIZE_T dat
{
block->size = data_size | block_get_flags( block );
block->unused_bytes = data_size - size;
- HEAP_CreateFreeBlock( subheap, next_block( subheap, block ), old_data_size - data_size );
+ create_free_block( subheap, next_block( subheap, block ), old_data_size - data_size );
}
else
{
@@ -1051,8 +1040,7 @@ static SUBHEAP *HEAP_CreateSubHeap( HEAP *heap, LPVOID address, DWORD flags,
/* Create the first free block */
- HEAP_CreateFreeBlock( subheap, (LPBYTE)subheap->base + subheap->headerSize,
- subheap->size - subheap->headerSize );
+ create_free_block( subheap, first_block( subheap ), subheap->size - subheap->headerSize );
return subheap;
}
More information about the wine-cvs
mailing list