Author: tkreuzer Date: Thu Feb 9 20:10:26 2012 New Revision: 55519 URL: http://svn.reactos.org/svn/reactos?rev=55519&view=rev Log: [FREELDR] Rename Heap_new.c to Heap.c
Added: trunk/reactos/boot/freeldr/freeldr/mm/heap.c - copied unchanged from r55497, trunk/reactos/boot/freeldr/freeldr/mm/heap_new.c Removed: trunk/reactos/boot/freeldr/freeldr/mm/heap_new.c Modified: trunk/reactos/boot/freeldr/freeldr/CMakeLists.txt Modified: trunk/reactos/boot/freeldr/freeldr/CMakeLists.txt URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/CMakeLists.txt?rev=55519&r1=55518&r2=55519&view=diff ============================================================================== --- trunk/reactos/boot/freeldr/freeldr/CMakeLists.txt [iso-8859-1] (original) +++ trunk/reactos/boot/freeldr/freeldr/CMakeLists.txt [iso-8859-1] Thu Feb 9 20:10:26 2012 @@ -54,7 +54,7 @@ inifile/parse.c mm/meminit.c mm/mm.c - mm/heap_new.c + mm/heap.c reactos/registry.c reactos/arcname.c reactos/archwsup.c Removed: trunk/reactos/boot/freeldr/freeldr/mm/heap_new.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/mm/heap_new.c?rev=55518&view=auto ============================================================================== --- trunk/reactos/boot/freeldr/freeldr/mm/heap_new.c [iso-8859-1] (original) +++ trunk/reactos/boot/freeldr/freeldr/mm/heap_new.c (removed) @@ -1,531 +1,0 @@ -/* - * FreeLoader - * Copyright (C) 2011 Timo Kreuzer (timo.kreu...@reactos.org) - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include <freeldr.h> -#include <debug.h> - -DBG_DEFAULT_CHANNEL(HEAP); - -#define DEFAULT_HEAP_SIZE (1024 * 1024) -#define TEMP_HEAP_SIZE (1024 * 1024) - -PVOID FrLdrDefaultHeap; -PVOID FrLdrTempHeap; - -typedef struct _BLOCK_DATA -{ - ULONG Flink; - ULONG Blink; -} BLOCK_DATA, *PBLOCK_DATA; - -typedef struct _HEAP_BLOCK -{ - USHORT Size; - USHORT PreviousSize; - ULONG Tag; - BLOCK_DATA Data[]; -} HEAP_BLOCK, *PHEAP_BLOCK; - -typedef struct _HEAP -{ - ULONG MaximumSize; - ULONG CurrentAllocBytes; - ULONG MaxAllocBytes; - ULONG NumAllocs; - ULONG NumFrees; - ULONG LargestAllocation; - ULONGLONG AllocationTime; - ULONGLONG FreeTime; - ULONG TerminatingBlock; - HEAP_BLOCK Blocks; -} HEAP, *PHEAP; - -PVOID -HeapCreate( - ULONG MaximumSize, - TYPE_OF_MEMORY MemoryType) -{ - PHEAP Heap; - PHEAP_BLOCK Block; - ULONG Remaining; - USHORT PreviousSize; - TRACE("HeapCreate(MemoryType=%ld)\n", MemoryType); - - /* Allocate some memory for the heap */ - MaximumSize = ALIGN_UP_BY(MaximumSize, MM_PAGE_SIZE); - Heap = MmAllocateMemoryWithType(MaximumSize, MemoryType); - if (!Heap) - { - ERR("HEAP: Failed to allocate heap of size 0x%lx, Type\n", - MaximumSize, MemoryType); - return NULL; - } - - /* Initialize the heap header */ - Heap->MaximumSize = MaximumSize; - Heap->CurrentAllocBytes = 0; - Heap->MaxAllocBytes = 0; - Heap->NumAllocs = 0; - Heap->NumFrees = 0; - Heap->LargestAllocation = 0; - - /* Calculate what's left to process */ - Remaining = (MaximumSize - sizeof(HEAP)) / sizeof(HEAP_BLOCK); - TRACE("Remaining = %ld\n", Remaining); - - /* Substract 2 for the terminating entry (header + free entry) */ - Remaining -= 2; - - Block = &Heap->Blocks; - PreviousSize = 0; - - /* Create free blocks */ - while (Remaining > 1) - { - /* Initialize this free block */ - Block->Size = (USHORT)min(MAXUSHORT, Remaining - 1); - Block->PreviousSize = PreviousSize; - Block->Tag = 0; - Block->Data[0].Flink = (Block - &Heap->Blocks) + Block->Size + 1; - Block->Data[0].Blink = (Block - &Heap->Blocks) - 1 - PreviousSize; - - /* Substract current block size from remainder */ - Remaining -= (Block->Size + 1); - - /* Go to next block */ - PreviousSize = Block->Size; - Block = Block + Block->Size + 1; - - TRACE("Remaining = %ld\n", Remaining); - } - - /* Now finish with a terminating block */ - Heap->TerminatingBlock = Block - &Heap->Blocks; - Block->Size = 0; - Block->PreviousSize = PreviousSize; - Block->Tag = 'dnE#'; - Block->Data[0].Flink = 0; - Block->Data[0].Blink = (Block - &Heap->Blocks) - 1 - PreviousSize; - Heap->Blocks.Data[0].Blink = Heap->TerminatingBlock; - - return Heap; -} - -VOID -HeapDestroy( - PVOID HeapHandle) -{ - PHEAP Heap = HeapHandle; - - /* Mark all pages as firmware temporary, so they are free for the kernel */ - MmMarkPagesInLookupTable(PageLookupTableAddress, - (ULONG_PTR)Heap / MM_PAGE_SIZE, - Heap->MaximumSize / MM_PAGE_SIZE, - LoaderFirmwareTemporary); -} - -VOID -HeapRelease( - PVOID HeapHandle) -{ - PHEAP Heap = HeapHandle; - PHEAP_BLOCK Block; - PUCHAR StartAddress, EndAddress; - ULONG FreePages, AllFreePages = 0; - TRACE("HeapRelease(%p)\n", HeapHandle); - - /* Loop all heap chunks */ - for (Block = &Heap->Blocks; - Block->Size != 0; - Block = Block + 1 + Block->Size) - { - /* Continue, if its not free */ - if (Block->Tag != 0) continue; - - /* Calculate page aligned start address of the free region */ - StartAddress = ALIGN_UP_POINTER_BY(Block->Data, PAGE_SIZE); - - /* Walk over adjacent free blocks */ - while (Block->Tag == 0) Block = Block + Block->Size + 1; - - /* Check if this was the last block */ - if (Block->Size == 0) - { - /* Align the end address up to cover the end of the heap */ - EndAddress = ALIGN_DOWN_POINTER_BY(Block->Data, PAGE_SIZE); - } - else - { - /* Align the end address down to not cover any allocations */ - EndAddress = ALIGN_DOWN_POINTER_BY(Block->Data, PAGE_SIZE); - } - - FreePages = (EndAddress - StartAddress) / MM_PAGE_SIZE; - AllFreePages += FreePages; - - /* Now mark the pages free */ - MmMarkPagesInLookupTable(PageLookupTableAddress, - (ULONG_PTR)StartAddress / MM_PAGE_SIZE, - FreePages, - LoaderFree); - - /* bail out, if it was the last block */ - if (Block->Size == 0) break; - } - - ERR("HeapRelease() done, freed %ld pages\n", AllFreePages); -} - -VOID -HeapCleanupAll(VOID) -{ - PHEAP Heap; - - Heap = FrLdrDefaultHeap; - ERR("Heap statistics for default heap:\n" - "CurrentAlloc=0x%lx, MaxAlloc=0x%lx, LargestAllocation=0x%lx\n" - "NumAllocs=%ld, NumFrees=%ld\n", - Heap->CurrentAllocBytes, Heap->MaxAllocBytes, Heap->LargestAllocation, - Heap->NumAllocs, Heap->NumFrees); - ERR("AllocTime = %I64d, FreeTime = %I64d, sum = %I64d\n", - Heap->AllocationTime, Heap->FreeTime, Heap->AllocationTime + Heap->FreeTime); - - - /* Release fre pages */ - HeapRelease(FrLdrDefaultHeap); - - Heap = FrLdrTempHeap; - ERR("Heap statistics for temp heap:\n" - "CurrentAlloc=0x%lx, MaxAlloc=0x%lx, LargestAllocation=0x%lx\n" - "NumAllocs=%ld, NumFrees=%ld\n", - Heap->CurrentAllocBytes, Heap->MaxAllocBytes, Heap->LargestAllocation, - Heap->NumAllocs, Heap->NumFrees); - - /* Destroy the heap */ - HeapDestroy(FrLdrTempHeap); -} - -static VOID -HeapRemoveFreeList( - PHEAP Heap, - PHEAP_BLOCK Block) -{ - PHEAP_BLOCK Previous, Next; - - Next = &Heap->Blocks + Block->Data[0].Flink; - Previous = &Heap->Blocks + Block->Data[0].Blink; - ASSERT((Next->Tag == 0) || (Next->Tag == 'dnE#')); - ASSERT(Next->Data[0].Blink == Block - &Heap->Blocks); - ASSERT((Previous->Tag == 0) || (Previous->Tag == 'dnE#')); - ASSERT(Previous->Data[0].Flink == Block - &Heap->Blocks); - - Next->Data[0].Blink = Previous - &Heap->Blocks; - Previous->Data[0].Flink = Next - &Heap->Blocks; -} - -static VOID -HeapInsertFreeList( - PHEAP Heap, - PHEAP_BLOCK FreeBlock) -{ - PHEAP_BLOCK ListHead, NextBlock; - ASSERT(FreeBlock->Tag == 0); - - /* Terminating block serves as free list head */ - ListHead = &Heap->Blocks + Heap->TerminatingBlock; - - for (NextBlock = &Heap->Blocks + ListHead->Data[0].Flink; - NextBlock < FreeBlock; - NextBlock = &Heap->Blocks + NextBlock->Data[0].Flink); - - FreeBlock->Data[0].Flink = NextBlock - &Heap->Blocks; - FreeBlock->Data[0].Blink = NextBlock->Data[0].Blink; - NextBlock->Data[0].Blink = FreeBlock - &Heap->Blocks; - NextBlock = &Heap->Blocks + FreeBlock->Data[0].Blink; - NextBlock->Data[0].Flink = FreeBlock - &Heap->Blocks; -} - -PVOID -HeapAllocate( - PVOID HeapHandle, - SIZE_T ByteSize, - ULONG Tag) -{ - PHEAP Heap = HeapHandle; - PHEAP_BLOCK Block, NextBlock; - USHORT BlockSize, Remaining; - ULONGLONG Time = __rdtsc(); - - /* Check if the allocation is too large */ - if ((ByteSize + sizeof(HEAP_BLOCK)) > MAXUSHORT * sizeof(HEAP_BLOCK)) - { - ERR("HEAP: Allocation of 0x%lx bytes too large\n", ByteSize); - return NULL; - } - - /* We need a proper tag */ - if (Tag == 0) Tag = 'enoN'; - - /* Calculate alloc size */ - BlockSize = (USHORT)((ByteSize + sizeof(HEAP_BLOCK) - 1) / sizeof(HEAP_BLOCK)); - - /* Walk the free block list */ - Block = &Heap->Blocks + Heap->TerminatingBlock; - for (Block = &Heap->Blocks + Block->Data[0].Flink; - Block->Size != 0; - Block = &Heap->Blocks + Block->Data[0].Flink) - { - ASSERT(Block->Tag == 0); - - /* Continue, if its too small */ - if (Block->Size < BlockSize) continue; - - /* This block is just fine, use it */ - Block->Tag = Tag; - - /* Remove this entry from the free list */ - HeapRemoveFreeList(Heap, Block); - - /* Calculate the remaining size */ - Remaining = Block->Size - BlockSize; - - /* Check if the remaining space is large enough for a new block */ - if (Remaining > 1) - { - /* Make the allocated block as large as neccessary */ - Block->Size = BlockSize; - - /* Get pointer to the new block */ - NextBlock = Block + 1 + BlockSize; - - /* Make it a free block */ - NextBlock->Tag = 0; - NextBlock->Size = Remaining - 1; - NextBlock->PreviousSize = BlockSize; - BlockSize = NextBlock->Size; - HeapInsertFreeList(Heap, NextBlock); - - /* Advance to the next block */ - NextBlock = NextBlock + 1 + BlockSize; - } - else - { - /* Not enough left, use the full block */ - BlockSize = Block->Size; - - /* Get the next block */ - NextBlock = Block + 1 + BlockSize; - } - - /* Update the next blocks back link */ - NextBlock->PreviousSize = BlockSize; - - /* Update heap usage */ - Heap->NumAllocs++; - Heap->CurrentAllocBytes += Block->Size * sizeof(HEAP_BLOCK); - Heap->MaxAllocBytes = max(Heap->MaxAllocBytes, Heap->CurrentAllocBytes); - Heap->LargestAllocation = max(Heap->LargestAllocation, - Block->Size * sizeof(HEAP_BLOCK)); - Heap->AllocationTime += (__rdtsc() - Time); - - TRACE("HeapAllocate(%p, %ld, %.4s) -> return %p\n", - HeapHandle, ByteSize, &Tag, Block->Data); - - /* Return pointer to the data */ - return Block->Data; - } - - /* We found nothing */ - WARN("HEAP: nothing suitable found for 0x%lx bytes\n", ByteSize); - return NULL; -} - -VOID -HeapFree( - PVOID HeapHandle, - PVOID Pointer, - ULONG Tag) -{ - PHEAP Heap = HeapHandle; - PHEAP_BLOCK Block, PrevBlock, NextBlock; - ULONGLONG Time = __rdtsc(); - TRACE("HeapFree(%p, %p)\n", HeapHandle, Pointer); - ASSERT(Tag != 'dnE#'); - - /* Check if the block is really inside this heap */ - if ((Pointer < (PVOID)(Heap + 1)) || - (Pointer > (PVOID)((PUCHAR)Heap + Heap->MaximumSize))) - { - ERR("HEAP: trying to free %p outside of heap %p\n", Pointer, Heap); - ASSERT(FALSE); - } - - Block = ((PHEAP_BLOCK)Pointer) - 1; - - /* Check if the tag matches */ - if ((Tag && (Block->Tag != Tag)) || (Block->Tag == 0)) - { - ERR("HEAP: Bad tag! Pointer=%p: block tag '%.4s', requested '%.4s', size=0x%lx\n", - Pointer, &Block->Tag, &Tag, Block->Size); - ASSERT(FALSE); - } - - /* Mark as free */ - Block->Tag = 0; - - /* Update heap usage */ - Heap->NumFrees++; - Heap->CurrentAllocBytes -= Block->Size * sizeof(HEAP_BLOCK); - - /* Get pointers to the next and previous block */ - PrevBlock = Block - Block->PreviousSize - 1; - NextBlock = Block + Block->Size + 1; - - /* Check if next block is free */ - if ((NextBlock->Tag == 0) && - ((Block->Size + NextBlock->Size + 1) <= MAXUSHORT)) - { - /* Merge next block into current */ - Block->Size += NextBlock->Size + 1; - HeapRemoveFreeList(Heap, NextBlock); - - NextBlock = Block + Block->Size + 1; - } - - /* Check if there is a block before and it's free */ - if ((Block->PreviousSize != 0) && (PrevBlock->Tag == 0) && - ((PrevBlock->Size + Block->Size + 1) <= MAXUSHORT)) - { - /* Merge current block into previous */ - PrevBlock->Size += Block->Size + 1; - Block = PrevBlock; - } - else - { - /* Insert the entry into the free list */ - HeapInsertFreeList(Heap, Block); - } - - /* Update the next block's back link */ - NextBlock->PreviousSize = Block->Size; - - Heap->FreeTime += (__rdtsc() - Time); -} - - -/* Wrapper functions *********************************************************/ - -VOID -MmInitializeHeap(PVOID PageLookupTable) -{ - TRACE("MmInitializeHeap()\n"); - - /* Create the default heap */ - FrLdrDefaultHeap = HeapCreate(DEFAULT_HEAP_SIZE, LoaderOsloaderHeap); - ASSERT(FrLdrDefaultHeap); - - /* Create a temporary heap */ - FrLdrTempHeap = HeapCreate(TEMP_HEAP_SIZE, LoaderFirmwareTemporary); - ASSERT(FrLdrTempHeap); - - TRACE("MmInitializeHeap() done, default heap %p, temp heap %p\n", - FrLdrDefaultHeap, FrLdrTempHeap); -} - -PVOID -MmHeapAlloc(ULONG MemorySize) -{ - return HeapAllocate(FrLdrDefaultHeap, MemorySize, 'pHmM'); -} - -VOID -MmHeapFree(PVOID MemoryPointer) -{ - HeapFree(FrLdrDefaultHeap, MemoryPointer, 'pHmM'); -} - - -#undef ExAllocatePoolWithTag -PVOID -NTAPI -ExAllocatePoolWithTag( - IN POOL_TYPE PoolType, - IN SIZE_T NumberOfBytes, - IN ULONG Tag) -{ - return HeapAllocate(FrLdrDefaultHeap, NumberOfBytes, Tag); -} - -PVOID -NTAPI -ExAllocatePool( - IN POOL_TYPE PoolType, - IN SIZE_T NumberOfBytes) -{ - return HeapAllocate(FrLdrDefaultHeap, NumberOfBytes, 0); -} - -#undef ExFreePool -VOID -NTAPI -ExFreePool( - IN PVOID P) -{ - HeapFree(FrLdrDefaultHeap, P, 0); -} - -#undef ExFreePoolWithTag -VOID -NTAPI -ExFreePoolWithTag( - IN PVOID P, - IN ULONG Tag) -{ - HeapFree(FrLdrDefaultHeap, P, Tag); -} - -PVOID -NTAPI -RtlAllocateHeap( - IN PVOID HeapHandle, - IN ULONG Flags, - IN SIZE_T Size) -{ - PVOID ptr; - - ptr = HeapAllocate(FrLdrDefaultHeap, Size, ' ltR'); - if (ptr && (Flags & HEAP_ZERO_MEMORY)) - { - RtlZeroMemory(ptr, Size); - } - - return ptr; -} - -BOOLEAN -NTAPI -RtlFreeHeap( - IN PVOID HeapHandle, - IN ULONG Flags, - IN PVOID HeapBase) -{ - HeapFree(FrLdrDefaultHeap, HeapBase, ' ltR'); - return TRUE; -} -