Author: jgardou
Date: Sun May 15 12:20:44 2011
New Revision: 51757
URL:
http://svn.reactos.org/svn/reactos?rev=51757&view=rev
Log:
[RTL/HEAP]
Commit some stuff reviewed by aleksey long ago
- get rid of LastEntryInSegment in HEAP_SEGMENT struct
- Simplify code for page commit
- Simplify code for splitting entries
Modified:
trunk/reactos/lib/rtl/heap.c
trunk/reactos/lib/rtl/heap.h
Modified: trunk/reactos/lib/rtl/heap.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/rtl/heap.c?rev=51757&a…
==============================================================================
--- trunk/reactos/lib/rtl/heap.c [iso-8859-1] (original)
+++ trunk/reactos/lib/rtl/heap.c [iso-8859-1] Sun May 15 12:20:44 2011
@@ -571,7 +571,7 @@
PLIST_ENTRY Current;
ULONG_PTR Address = 0;
PHEAP_UCR_DESCRIPTOR UcrDescriptor, PreviousUcr = NULL;
- PHEAP_ENTRY FirstEntry, LastEntry, PreviousLastEntry;
+ PHEAP_ENTRY FirstEntry, LastEntry;
NTSTATUS Status;
DPRINT("RtlpFindAndCommitPages(%p %p %x %p)\n", Heap, Segment, *Size,
Address);
@@ -619,40 +619,17 @@
/* Calculate first and last entries */
FirstEntry = (PHEAP_ENTRY)Address;
- if ((Segment->LastEntryInSegment->Flags & HEAP_ENTRY_LAST_ENTRY)
&&
- (ULONG_PTR)(Segment->LastEntryInSegment +
Segment->LastEntryInSegment->Size) == (ULONG_PTR)UcrDescriptor->Address)
- {
- LastEntry = Segment->LastEntryInSegment;
- }
+ /* Go through the entries to find the last one */
+ if (PreviousUcr)
+ LastEntry = (PHEAP_ENTRY)((ULONG_PTR)PreviousUcr->Address +
PreviousUcr->Size);
else
- {
- /* Go through the entries to find the last one */
-
- if (PreviousUcr)
- LastEntry = (PHEAP_ENTRY)((ULONG_PTR)PreviousUcr->Address +
PreviousUcr->Size);
- else
- LastEntry = Segment->FirstEntry;
-
- while (!(LastEntry->Flags & HEAP_ENTRY_LAST_ENTRY))
- {
- PreviousLastEntry = LastEntry;
- LastEntry += LastEntry->Size;
-
- if ((ULONG_PTR)LastEntry >= (ULONG_PTR)Segment->LastValidEntry
||
- LastEntry->Size == 0)
- {
- if (LastEntry == (PHEAP_ENTRY)Address)
- {
- /* Found it */
- LastEntry = PreviousLastEntry;
- break;
- }
-
- DPRINT1("Last entry not found in a committed range near to
%p\n", PreviousLastEntry);
- return NULL;
- }
- }
- }
+ LastEntry = &Segment->Entry;
+
+ while (!(LastEntry->Flags & HEAP_ENTRY_LAST_ENTRY))
+ {
+ LastEntry += LastEntry->Size;
+ }
+ ASSERT((LastEntry + LastEntry->Size) == FirstEntry);
/* Unmark it as a last entry */
LastEntry->Flags &= ~HEAP_ENTRY_LAST_ENTRY;
@@ -663,20 +640,28 @@
DPRINT("Updating UcrDescriptor %p, new Address %p, size %d\n",
UcrDescriptor, UcrDescriptor->Address, UcrDescriptor->Size);
+
+ /* Set various first entry fields*/
+ FirstEntry->SegmentOffset = LastEntry->SegmentOffset;
+ FirstEntry->Size = *Size >> HEAP_ENTRY_SHIFT;
+ FirstEntry->PreviousSize = LastEntry->Size;
/* Check if anything left in this UCR */
if (UcrDescriptor->Size == 0)
{
/* It's fully exhausted */
- if (UcrDescriptor->Address == Segment->LastValidEntry)
+
+ /* Check if this is the end of the segment */
+ if(UcrDescriptor->Address == Segment->LastValidEntry)
{
FirstEntry->Flags = HEAP_ENTRY_LAST_ENTRY;
- Segment->LastEntryInSegment = FirstEntry;
}
else
{
FirstEntry->Flags = 0;
- Segment->LastEntryInSegment = Segment->FirstEntry;
+ /* Update field of next entry */
+ ASSERT((FirstEntry + FirstEntry->Size)->PreviousSize == 0);
+ (FirstEntry + FirstEntry->Size)->PreviousSize =
FirstEntry->Size;
}
/* This UCR needs to be removed because it became useless */
@@ -688,18 +673,8 @@
else
{
FirstEntry->Flags = HEAP_ENTRY_LAST_ENTRY;
- Segment->LastEntryInSegment = FirstEntry;
- }
-
- /* Set various first entry fields*/
- FirstEntry->SegmentOffset = LastEntry->SegmentOffset;
- FirstEntry->Size = *Size >> HEAP_ENTRY_SHIFT;
- FirstEntry->PreviousSize = LastEntry->Size;
-
- /* Update previous size */
- if (!(FirstEntry->Flags & HEAP_ENTRY_LAST_ENTRY))
- (FirstEntry + FirstEntry->Size)->PreviousSize =
FirstEntry->Size;
-
+ }
+
/* We're done */
return (PHEAP_FREE_ENTRY)FirstEntry;
}
@@ -820,9 +795,6 @@
FreeEntry->Size = PrecedingSize;
Heap->TotalFreeSize += PrecedingSize;
- /* Set last entry in the segment to this entry */
- Segment->LastEntryInSegment = (PHEAP_ENTRY)FreeEntry;
-
/* Insert it into the free list */
RtlpInsertFreeBlockHelper(Heap, FreeEntry, PrecedingSize, FALSE);
}
@@ -830,12 +802,6 @@
{
/* Adjust preceding in use entry */
PrecedingInUseEntry->Flags |= HEAP_ENTRY_LAST_ENTRY;
- Segment->LastEntryInSegment = PrecedingInUseEntry;
- } else if ((ULONG_PTR)Segment->LastEntryInSegment >= DecommitBase &&
- ((PCHAR)Segment->LastEntryInSegment < ((PCHAR)DecommitBase +
DecommitSize)))
- {
- /* Update this segment's last entry */
- Segment->LastEntryInSegment = Segment->FirstEntry;
}
/* Now the next one */
@@ -941,9 +907,6 @@
HeapEntry->PreviousSize = Segment->Entry.Size;
HeapEntry->SegmentOffset = SegmentIndex;
- /* Set last entry in segment */
- Segment->LastEntryInSegment = HeapEntry;
-
/* Insert it */
RtlpInsertFreeBlock(Heap, (PHEAP_FREE_ENTRY)HeapEntry, (PHEAP_ENTRY)UncommittedBase -
HeapEntry);
@@ -1108,10 +1071,6 @@
/* Copy flags */
CurrentEntry->Flags = FreeEntry->Flags & HEAP_ENTRY_LAST_ENTRY;
- /* Update last entry in the segment */
- if (CurrentEntry->Flags & HEAP_ENTRY_LAST_ENTRY)
- Heap->Segments[CurrentEntry->SegmentOffset]->LastEntryInSegment =
(PHEAP_ENTRY)CurrentEntry;
-
/* Advance FreeEntry and update sizes */
FreeEntry = CurrentEntry;
*FreeSize = *FreeSize + CurrentEntry->Size;
@@ -1144,10 +1103,6 @@
/* Copy flags */
FreeEntry->Flags = NextEntry->Flags & HEAP_ENTRY_LAST_ENTRY;
-
- /* Update last entry in the segment */
- if (FreeEntry->Flags & HEAP_ENTRY_LAST_ENTRY)
- Heap->Segments[FreeEntry->SegmentOffset]->LastEntryInSegment =
(PHEAP_ENTRY)FreeEntry;
/* Remove next entry now */
RtlpRemoveFreeBlock(Heap, NextEntry, FALSE, FALSE);
@@ -1794,7 +1749,7 @@
SIZE_T Index,
SIZE_T Size)
{
- PHEAP_FREE_ENTRY SplitBlock, SplitBlock2;
+ PHEAP_FREE_ENTRY SplitBlock;
UCHAR FreeFlags;
PHEAP_ENTRY InUseEntry;
SIZE_T FreeSize;
@@ -1836,70 +1791,13 @@
SplitBlock->SegmentOffset = InUseEntry->SegmentOffset;
SplitBlock->Size = FreeSize;
SplitBlock->PreviousSize = Index;
-
- /* Check if it's the last entry */
- if (FreeFlags & HEAP_ENTRY_LAST_ENTRY)
- {
- /* Insert it to the free list if it's the last entry */
- RtlpInsertFreeBlockHelper(Heap, SplitBlock, FreeSize, FALSE);
- Heap->TotalFreeSize += FreeSize;
- }
- else
- {
- /* Not so easy - need to update next's previous size too */
- SplitBlock2 = (PHEAP_FREE_ENTRY)((PHEAP_ENTRY)SplitBlock + FreeSize);
-
- if (SplitBlock2->Flags & HEAP_ENTRY_BUSY)
- {
- SplitBlock2->PreviousSize = (USHORT)FreeSize;
- RtlpInsertFreeBlockHelper(Heap, SplitBlock, FreeSize, FALSE);
- Heap->TotalFreeSize += FreeSize;
- }
- else
- {
- /* Even more complex - the next entry is free, so we can merge them
into one! */
- SplitBlock->Flags = SplitBlock2->Flags;
-
- /* Remove that next entry */
- RtlpRemoveFreeBlock(Heap, SplitBlock2, FALSE, FALSE);
-
- /* Update sizes */
- FreeSize += SplitBlock2->Size;
- Heap->TotalFreeSize -= SplitBlock2->Size;
-
- if (FreeSize <= HEAP_MAX_BLOCK_SIZE)
- {
- /* Insert it back */
- SplitBlock->Size = FreeSize;
-
- /* Don't forget to update previous size of the next entry!
*/
- if (!(SplitBlock->Flags & HEAP_ENTRY_LAST_ENTRY))
- {
- ((PHEAP_FREE_ENTRY)((PHEAP_ENTRY)SplitBlock +
FreeSize))->PreviousSize = FreeSize;
- }
-
- /* Actually insert it */
- RtlpInsertFreeBlockHelper(Heap, SplitBlock, (USHORT)FreeSize,
FALSE);
-
- /* Update total size */
- Heap->TotalFreeSize += FreeSize;
- }
- else
- {
- /* Resulting block is quite big */
- RtlpInsertFreeBlock(Heap, SplitBlock, FreeSize);
- }
- }
- }
-
- /* Reset flags of the free entry */
+
+ /* Coalesce it with the next entry */
+ SplitBlock = RtlpCoalesceFreeBlocks(Heap, SplitBlock, &FreeSize, FALSE);
+ RtlpInsertFreeBlock(Heap, SplitBlock, FreeSize);
+
+ /* Reset the flag */
FreeFlags = 0;
-
- /* Update last entry in segment */
- if (SplitBlock->Flags & HEAP_ENTRY_LAST_ENTRY)
- {
- Heap->Segments[SplitBlock->SegmentOffset]->LastEntryInSegment =
(PHEAP_ENTRY)SplitBlock;
- }
}
}
@@ -2535,9 +2433,7 @@
/* Either update previous size of the next entry or mark it as a last
entry in the segment*/
- if (RememberFlags & HEAP_ENTRY_LAST_ENTRY)
- Heap->Segments[InUseEntry->SegmentOffset]->LastEntryInSegment =
InUseEntry;
- else
+ if (!(RememberFlags & HEAP_ENTRY_LAST_ENTRY))
(InUseEntry + InUseEntry->Size)->PreviousSize = InUseEntry->Size;
}
else
@@ -2551,8 +2447,7 @@
/* Update the following block or set the last entry in the segment */
if (RememberFlags & HEAP_ENTRY_LAST_ENTRY)
{
- /* Set last entry and set flags and size */
- Heap->Segments[InUseEntry->SegmentOffset]->LastEntryInSegment =
InUseEntry;
+ /* Set flags and size */
UnusedEntry->Flags = RememberFlags;
UnusedEntry->Size = FreeSize;
@@ -2597,9 +2492,7 @@
/* Fine for a dedicated list */
UnusedEntry->Size = FreeSize;
- if (RememberFlags & HEAP_ENTRY_LAST_ENTRY)
-
Heap->Segments[UnusedEntry->SegmentOffset]->LastEntryInSegment =
(PHEAP_ENTRY)UnusedEntry;
- else
+ if (!(RememberFlags & HEAP_ENTRY_LAST_ENTRY))
((PHEAP_ENTRY)UnusedEntry + FreeSize)->PreviousSize =
FreeSize;
/* Insert it back and update total size */
@@ -2752,7 +2645,7 @@
{
RtlEnterHeapLock(Heap->LockVariable);
HeapLocked = TRUE;
- Flags ^= HEAP_NO_SERIALIZE;
+ Flags &= ~HEAP_NO_SERIALIZE;
}
/* Get the pointer to the in-use entry */
@@ -2918,9 +2811,6 @@
/* Is that the last entry */
if (FreeFlags & HEAP_ENTRY_LAST_ENTRY)
{
- /* Update segment's last entry */
-
Heap->Segments[SplitBlock->SegmentOffset]->LastEntryInSegment =
(PHEAP_ENTRY)SplitBlock;
-
/* Set its size and insert it to the list */
SplitBlock->Size = (USHORT)FreeSize;
RtlpInsertFreeBlockHelper(Heap, SplitBlock, FreeSize, FALSE);
@@ -2967,10 +2857,6 @@
{
/* Update previous size of the next entry */
((PHEAP_FREE_ENTRY)((PHEAP_ENTRY)SplitBlock +
FreeSize))->PreviousSize = FreeSize;
- }
- else
- {
-
Heap->Segments[SplitBlock->SegmentOffset]->LastEntryInSegment =
(PHEAP_ENTRY)SplitBlock;
}
/* Insert the new one back and update total size */
Modified: trunk/reactos/lib/rtl/heap.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/rtl/heap.h?rev=51757&a…
==============================================================================
--- trunk/reactos/lib/rtl/heap.h [iso-8859-1] (original)
+++ trunk/reactos/lib/rtl/heap.h [iso-8859-1] Sun May 15 12:20:44 2011
@@ -277,7 +277,6 @@
USHORT SegmentAllocatorBackTraceIndex;
USHORT Reserved;
LIST_ENTRY UCRSegmentList;
- PHEAP_ENTRY LastEntryInSegment; //FIXME: non-Vista
} HEAP_SEGMENT, *PHEAP_SEGMENT;
typedef struct _HEAP_UCR_DESCRIPTOR