[PATCH 2/3] ntdll: Introduce new find_free_block_in_list helper.
Rémi Bernon
rbernon at codeweavers.com
Fri Jan 15 09:11:21 CST 2021
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
dlls/ntdll/heap.c | 42 +++++++++++++++++++++++++++++++-----------
1 file changed, 31 insertions(+), 11 deletions(-)
diff --git a/dlls/ntdll/heap.c b/dlls/ntdll/heap.c
index 31a7ba18d61..b7dab61dcd9 100644
--- a/dlls/ntdll/heap.c
+++ b/dlls/ntdll/heap.c
@@ -1004,20 +1004,13 @@ static SUBHEAP *HEAP_CreateSubHeap( HEAP *heap, LPVOID address, DWORD flags,
/***********************************************************************
- * HEAP_FindFreeBlock
- *
- * Find a free block at least as large as the requested size, and make sure
- * the requested size is committed.
+ * find_free_block_in_list
*/
-static ARENA_FREE *HEAP_FindFreeBlock( HEAP *heap, SIZE_T size,
- SUBHEAP **ppSubHeap )
+static ARENA_FREE *find_free_block_in_list( HEAP *heap, SIZE_T size, FREE_LIST_ENTRY *pEntry,
+ SUBHEAP **ppSubHeap )
{
SUBHEAP *subheap;
struct list *ptr;
- SIZE_T total_size;
- FREE_LIST_ENTRY *pEntry = heap->freeList + get_freelist_index( size + sizeof(ARENA_INUSE) );
-
- /* Find a suitable free list, and in it find a block large enough */
ptr = &pEntry->arena.entry;
while ((ptr = list_next( &heap->freeList[0].arena.entry, ptr )))
@@ -1028,12 +1021,39 @@ static ARENA_FREE *HEAP_FindFreeBlock( HEAP *heap, SIZE_T size,
if (arena_size >= size)
{
subheap = HEAP_FindSubHeap( heap, pArena );
- if (!HEAP_Commit( subheap, (ARENA_INUSE *)pArena, size )) return NULL;
*ppSubHeap = subheap;
return pArena;
}
}
+ return NULL;
+}
+
+
+/***********************************************************************
+ * HEAP_FindFreeBlock
+ *
+ * Find a free block at least as large as the requested size, and make sure
+ * the requested size is committed.
+ */
+static ARENA_FREE *HEAP_FindFreeBlock( HEAP *heap, SIZE_T size,
+ SUBHEAP **ppSubHeap )
+{
+ SUBHEAP *subheap;
+ SIZE_T total_size, index = get_freelist_index( size + sizeof(ARENA_INUSE) );
+ FREE_LIST_ENTRY *pEntry = NULL;
+ ARENA_FREE *pArena;
+
+ /* Find a suitable free list, and in it find a block large enough */
+
+ if (index < HEAP_NB_FREE_LISTS) pEntry = heap->freeList + index;
+
+ if (pEntry && (pArena = find_free_block_in_list( heap, size, pEntry, ppSubHeap )))
+ {
+ if (!HEAP_Commit( *ppSubHeap, (ARENA_INUSE *)pArena, size )) return NULL;
+ return pArena;
+ }
+
/* If no block was found, attempt to grow the heap */
if (!(heap->flags & HEAP_GROWABLE))
--
2.30.0
More information about the wine-devel
mailing list