- pArena->size |= ARENA_FLAG_FREE;
- pArena->next = pEntry->arena.next;
- pArena->next->prev = pArena;
- pArena->prev = &pEntry->arena;
- pEntry->arena.next = pArena;
+ if (last)
+ {
+ /* insert at end of free list, i.e. before next free list entry */
+ pEntry++;
+ 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;