Insert the last free block of a subheap at the end of the free list to

avoid using uncomitted space unless really necessary.
This commit is contained in:
Alexandre Julliard 2003-04-14 21:44:21 +00:00
parent 96af8c2ff5
commit 46adbecd13
1 changed files with 24 additions and 8 deletions

View File

@ -290,15 +290,29 @@ static HEAP *HEAP_GetPtr(
* *
* Insert a free block into the free list. * Insert a free block into the free list.
*/ */
static void HEAP_InsertFreeBlock( HEAP *heap, ARENA_FREE *pArena ) static inline void HEAP_InsertFreeBlock( HEAP *heap, ARENA_FREE *pArena, BOOL last )
{ {
FREE_LIST_ENTRY *pEntry = heap->freeList; FREE_LIST_ENTRY *pEntry = heap->freeList;
while (pEntry->size < pArena->size) pEntry++; while (pEntry->size < pArena->size) pEntry++;
pArena->size |= ARENA_FLAG_FREE; if (last)
pArena->next = pEntry->arena.next; {
pArena->next->prev = pArena; /* insert at end of free list, i.e. before the next free list entry */
pArena->prev = &pEntry->arena; pEntry++;
pEntry->arena.next = pArena; if (pEntry == &heap->freeList[HEAP_NB_FREE_LISTS]) pEntry = heap->freeList;
pArena->prev = pEntry->arena.prev;
pArena->prev->next = pArena;
pArena->next = &pEntry->arena;
pEntry->arena.prev = pArena;
}
else
{
/* insert at head of free list */
pArena->next = pEntry->arena.next;
pArena->next->prev = pArena;
pArena->prev = &pEntry->arena;
pEntry->arena.next = pArena;
}
pArena->size |= ARENA_FLAG_FREE;
} }
@ -388,6 +402,7 @@ static void HEAP_CreateFreeBlock( SUBHEAP *subheap, void *ptr, DWORD size )
{ {
ARENA_FREE *pFree; ARENA_FREE *pFree;
char *pEnd; char *pEnd;
BOOL last;
/* Create a free arena */ /* Create a free arena */
mark_block_uninitialized( ptr, sizeof( ARENA_FREE ) ); mark_block_uninitialized( ptr, sizeof( ARENA_FREE ) );
@ -415,7 +430,8 @@ static void HEAP_CreateFreeBlock( SUBHEAP *subheap, void *ptr, DWORD size )
/* Set the next block PREV_FREE flag and pointer */ /* Set the next block PREV_FREE flag and pointer */
if ((char *)ptr + size < (char *)subheap + subheap->size) last = ((char *)ptr + size >= (char *)subheap + subheap->size);
if (!last)
{ {
DWORD *pNext = (DWORD *)((char *)ptr + size); DWORD *pNext = (DWORD *)((char *)ptr + size);
*pNext |= ARENA_FLAG_PREV_FREE; *pNext |= ARENA_FLAG_PREV_FREE;
@ -426,7 +442,7 @@ static void HEAP_CreateFreeBlock( SUBHEAP *subheap, void *ptr, DWORD size )
/* Last, insert the new block into the free list */ /* Last, insert the new block into the free list */
pFree->size = size - sizeof(*pFree); pFree->size = size - sizeof(*pFree);
HEAP_InsertFreeBlock( subheap->heap, pFree ); HEAP_InsertFreeBlock( subheap->heap, pFree, last );
} }