[RTL]
authorThomas Faber <thomas.faber@reactos.org>
Tue, 20 Jun 2017 17:15:43 +0000 (17:15 +0000)
committerThomas Faber <thomas.faber@reactos.org>
Tue, 20 Jun 2017 17:15:43 +0000 (17:15 +0000)
- Correctly use the page heap's lock in RtlLockHeap/RtlUnlockHeap when appropriate. Fixes assertion failure when Global/Local memory allocations are performed concurrently with DPH enabled.

svn path=/trunk/; revision=75152

reactos/sdk/lib/rtl/heap.c
reactos/sdk/lib/rtl/heap.h
reactos/sdk/lib/rtl/heappage.c

index 227224e..1c6df29 100644 (file)
@@ -2982,7 +2982,11 @@ RtlLockHeap(IN HANDLE HeapPtr)
 {
     PHEAP Heap = (PHEAP)HeapPtr;
 
-    // FIXME Check for special heap
+    /* Check for page heap */
+    if (Heap->ForceFlags & HEAP_FLAG_PAGE_ALLOCS)
+    {
+        return RtlpPageHeapLock(Heap);
+    }
 
     /* Check if it's really a heap */
     if (Heap->Signature != HEAP_SIGNATURE) return FALSE;
@@ -3015,7 +3019,11 @@ RtlUnlockHeap(HANDLE HeapPtr)
 {
     PHEAP Heap = (PHEAP)HeapPtr;
 
-    // FIXME Check for special heap
+    /* Check for page heap */
+    if (Heap->ForceFlags & HEAP_FLAG_PAGE_ALLOCS)
+    {
+        return RtlpPageHeapUnlock(Heap);
+    }
 
     /* Check if it's really a heap */
     if (Heap->Signature != HEAP_SIGNATURE) return FALSE;
index 5a54c3f..c4c46a4 100644 (file)
@@ -435,6 +435,12 @@ RtlpPageHeapReAllocate(HANDLE HeapPtr,
                        PVOID Ptr,
                        SIZE_T Size);
 
+BOOLEAN NTAPI
+RtlpPageHeapLock(HANDLE HeapPtr);
+
+BOOLEAN NTAPI
+RtlpPageHeapUnlock(HANDLE HeapPtr);
+
 BOOLEAN NTAPI
 RtlpPageHeapGetUserInfo(PVOID HeapHandle,
                         ULONG Flags,
index 7dde225..08857e7 100644 (file)
@@ -2349,4 +2349,32 @@ RtlpDphNormalHeapValidate(PDPH_HEAP_ROOT DphRoot,
     return RtlValidateHeap(DphRoot->NormalHeap, Flags, BlockInfo);
 }
 
+BOOLEAN
+NTAPI
+RtlpPageHeapLock(HANDLE HeapPtr)
+{
+    PDPH_HEAP_ROOT DphRoot;
+
+    /* Get pointer to the heap root */
+    DphRoot = RtlpDphPointerFromHandle(HeapPtr);
+    if (!DphRoot) return FALSE;
+
+    RtlpDphEnterCriticalSection(DphRoot, DphRoot->HeapFlags);
+    return TRUE;
+}
+
+BOOLEAN
+NTAPI
+RtlpPageHeapUnlock(HANDLE HeapPtr)
+{
+    PDPH_HEAP_ROOT DphRoot;
+
+    /* Get pointer to the heap root */
+    DphRoot = RtlpDphPointerFromHandle(HeapPtr);
+    if (!DphRoot) return FALSE;
+
+    RtlpDphLeaveCriticalSection(DphRoot);
+    return TRUE;
+}
+
 /* EOF */