[ros-diffs] [fireball] 50734: [RTL/DPH] - Connect debug page heap routines in the debug heap implementation, so they are going to be actually called now. - Implement delayed free queue initialization and freeing.

fireball at svn.reactos.org fireball at svn.reactos.org
Wed Feb 16 13:09:18 UTC 2011


Author: fireball
Date: Wed Feb 16 13:09:18 2011
New Revision: 50734

URL: http://svn.reactos.org/svn/reactos?rev=50734&view=rev
Log:
[RTL/DPH]
- Connect debug page heap routines in the debug heap implementation, so they are going to be actually called now.
- Implement delayed free queue initialization and freeing.

Modified:
    trunk/reactos/lib/rtl/heapdbg.c
    trunk/reactos/lib/rtl/heappage.c

Modified: trunk/reactos/lib/rtl/heapdbg.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/rtl/heapdbg.c?rev=50734&r1=50733&r2=50734&view=diff
==============================================================================
--- trunk/reactos/lib/rtl/heapdbg.c [iso-8859-1] (original)
+++ trunk/reactos/lib/rtl/heapdbg.c [iso-8859-1] Wed Feb 16 13:09:18 2011
@@ -136,8 +136,8 @@
     BOOLEAN HeapLocked = FALSE;
     PVOID Result;
 
-    //if (Heap->ForceFlags & HEAP_FLAG_PAGE_ALLOCS)
-        //return RtlpPageHeapAllocateHeap(HeapPtr, Flags, Size);
+    if (Heap->ForceFlags & HEAP_FLAG_PAGE_ALLOCS)
+        return RtlpPageHeapAllocate(HeapPtr, Flags, Size);
 
     if (Heap->Signature != HEAP_SIGNATURE)
     {
@@ -203,8 +203,8 @@
     PVOID Result = NULL;
     PHEAP_ENTRY HeapEntry;
 
-    //if (Heap->ForceFlags & HEAP_FLAG_PAGE_ALLOCS)
-        //return RtlpPageHeapReAllocateHeap(HeapPtr, Flags, Size);
+    if (Heap->ForceFlags & HEAP_FLAG_PAGE_ALLOCS)
+        return RtlpPageHeapReAllocate(HeapPtr, Flags, Ptr, Size);
 
     if (Heap->Signature != HEAP_SIGNATURE)
     {
@@ -273,8 +273,8 @@
     PHEAP_ENTRY HeapEntry;
     BOOLEAN Result = FALSE;
 
-    //if (Heap->ForceFlags & HEAP_FLAG_PAGE_ALLOCS)
-        //return RtlpPageHeapFreeHeap(HeapPtr, Flags, Size);
+    if (Heap->ForceFlags & HEAP_FLAG_PAGE_ALLOCS)
+        return RtlpPageHeapFree(HeapPtr, Flags, Ptr);
 
     if (Heap->Signature != HEAP_SIGNATURE)
     {
@@ -330,8 +330,8 @@
     PHEAP_ENTRY HeapEntry;
     BOOLEAN Result = FALSE;
 
-    //if (Heap->ForceFlags & HEAP_FLAG_PAGE_ALLOCS)
-        //return RtlpPageHeapGetUserInfoHeap(HeapPtr, Flags, Size);
+    if (Heap->ForceFlags & HEAP_FLAG_PAGE_ALLOCS)
+        return RtlpPageHeapGetUserInfo(HeapHandle, Flags, BaseAddress, UserValue, UserFlags);
 
     if (Heap->Signature != HEAP_SIGNATURE)
     {
@@ -382,8 +382,8 @@
     PHEAP_ENTRY HeapEntry;
     BOOLEAN Result = FALSE;
 
-    //if (Heap->ForceFlags & HEAP_FLAG_PAGE_ALLOCS)
-        //return RtlpPageHeapSetUserValueHeap(HeapPtr, Flags, Size);
+    if (Heap->ForceFlags & HEAP_FLAG_PAGE_ALLOCS)
+        return RtlpPageHeapSetUserValue(HeapHandle, Flags, BaseAddress, UserValue);
 
     if (Heap->Signature != HEAP_SIGNATURE)
     {
@@ -439,8 +439,8 @@
     PHEAP_ENTRY HeapEntry;
     BOOLEAN Result = FALSE;
 
-    //if (Heap->ForceFlags & HEAP_FLAG_PAGE_ALLOCS)
-        //return RtlPageHeapSetUserFlagsHeap(HeapPtr, Flags, BaseAddress, UserFlagsReset, UserFlagsSet);
+    if (Heap->ForceFlags & HEAP_FLAG_PAGE_ALLOCS)
+        return RtlpPageHeapSetUserFlags(HeapHandle, Flags, BaseAddress, UserFlagsReset, UserFlagsSet);
 
     /* Check if this heap allows flags to be set at all */
     if (UserFlagsSet & ~HEAP_SETTABLE_USER_FLAGS ||
@@ -500,8 +500,8 @@
     PHEAP_ENTRY HeapEntry;
     SIZE_T Result = ~(SIZE_T)0;
 
-    //if (Heap->ForceFlags & HEAP_FLAG_PAGE_ALLOCS)
-        //return RtlPageHeapSizeHeap(HeapPtr, Flags, Ptr);
+    if (Heap->ForceFlags & HEAP_FLAG_PAGE_ALLOCS)
+        return RtlpPageHeapSize(HeapPtr, Flags, Ptr);
 
     /* Check heap signature */
     if (Heap->Signature != HEAP_SIGNATURE)

Modified: trunk/reactos/lib/rtl/heappage.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/rtl/heappage.c?rev=50734&r1=50733&r2=50734&view=diff
==============================================================================
--- trunk/reactos/lib/rtl/heappage.c [iso-8859-1] (original)
+++ trunk/reactos/lib/rtl/heappage.c [iso-8859-1] Wed Feb 16 13:09:18 2011
@@ -117,6 +117,12 @@
 ULONG RtlpDphPageHeapListLength;
 UNICODE_STRING RtlpDphTargetDllsUnicode;
 
+RTL_CRITICAL_SECTION RtlpDphDelayedFreeQueueLock;
+LIST_ENTRY RtlpDphDelayedFreeQueue;
+SLIST_HEADER RtlpDphDelayedTemporaryPushList;
+ULONG RtlpDphMemoryUsedByDelayedFreeBlocks;
+ULONG RtlpDphNumberOfDelayedFreeBlocks;
+
 /* Counters */
 LONG RtlpDphCounter;
 LONG RtlpDphAllocFails;
@@ -174,6 +180,13 @@
 BOOLEAN NTAPI
 RtlpDphGrowVirtual(PDPH_HEAP_ROOT DphRoot, SIZE_T Size);
 
+BOOLEAN NTAPI
+RtlpDphIsNormalFreeHeapBlock(PVOID Block, PULONG ValidationInformation, BOOLEAN CheckFillers);
+
+VOID NTAPI
+RtlpDphReportCorruptedBlock(PDPH_HEAP_ROOT DphRoot, ULONG Reserved, PVOID Block, ULONG ValidationInfo);
+
+
 PVOID NTAPI
 RtlpDphPointerFromHandle(PVOID Handle)
 {
@@ -884,15 +897,78 @@
 NTSTATUS NTAPI
 RtlpDphInitializeDelayedFreeQueue()
 {
-    UNIMPLEMENTED;
-    return STATUS_SUCCESS;
+    NTSTATUS Status;
+
+    Status = RtlInitializeCriticalSection(&RtlpDphDelayedFreeQueueLock);
+    if (!NT_SUCCESS(Status))
+    {
+        // TODO: Log this error!
+        DPRINT1("Failure initializing delayed free queue critical section\n");
+        return Status;
+    }
+
+    /* Initialize lists */
+    InitializeListHead(&RtlpDphDelayedFreeQueue);
+    RtlInitializeSListHead(&RtlpDphDelayedTemporaryPushList);
+
+    /* Reset counters */
+    RtlpDphMemoryUsedByDelayedFreeBlocks = 0;
+    RtlpDphNumberOfDelayedFreeBlocks = 0;
+
+    return Status;
 }
 
 VOID NTAPI
 RtlpDphFreeDelayedBlocksFromHeap(PDPH_HEAP_ROOT DphRoot,
                                  PHEAP NormalHeap)
 {
-    UNIMPLEMENTED;
+    PLIST_ENTRY Current, Next;
+    PDPH_BLOCK_INFORMATION BlockInfo;
+    ULONG ValidationInfo;
+
+    /* The original routine seems to use a temporary SList to put blocks to be freed,
+       then it releases the lock and frees the blocks. But let's make it simple for now */
+
+    /* Acquire the delayed free queue lock */
+    RtlEnterCriticalSection(&RtlpDphDelayedFreeQueueLock);
+
+    /* Traverse the list */
+    Current = RtlpDphDelayedFreeQueue.Flink;
+    while (Current != &RtlpDphDelayedFreeQueue);
+    {
+        /* Get the next entry pointer */
+        Next = Current->Flink;
+
+        BlockInfo = CONTAINING_RECORD(Current, DPH_BLOCK_INFORMATION, FreeQueue);
+
+        /* Check if it belongs to the same heap */
+        if (BlockInfo->Heap == DphRoot)
+        {
+            /* Remove it from the list */
+            RemoveEntryList(Current);
+
+            /* Reset its heap to NULL */
+            BlockInfo->Heap = NULL;
+
+            if (!RtlpDphIsNormalFreeHeapBlock(BlockInfo + 1, &ValidationInfo, TRUE))
+            {
+                RtlpDphReportCorruptedBlock(DphRoot, 10, BlockInfo + 1, ValidationInfo);
+            }
+
+            /* Decrement counters */
+            RtlpDphMemoryUsedByDelayedFreeBlocks -= BlockInfo->ActualSize;
+            RtlpDphNumberOfDelayedFreeBlocks--;
+
+            /* Free the normal heap */
+            RtlFreeHeap (NormalHeap, 0, BlockInfo);
+        }
+
+        /* Move to the next one */
+        Current = Next;
+    }
+
+    /* Release the delayed free queue lock */
+    RtlLeaveCriticalSection(&RtlpDphDelayedFreeQueueLock);
 }
 
 NTSTATUS NTAPI
@@ -1025,6 +1101,18 @@
     }
 
     return (SomethingWrong == FALSE);
+}
+
+BOOLEAN NTAPI
+RtlpDphIsNormalFreeHeapBlock(PVOID Block,
+                             PULONG ValidationInformation,
+                             BOOLEAN CheckFillers)
+{
+    ASSERT(ValidationInformation != NULL);
+
+    UNIMPLEMENTED;
+    *ValidationInformation = 0;
+    return TRUE;
 }
 
 NTSTATUS NTAPI




More information about the Ros-diffs mailing list