- 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
{
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;
{
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;
PVOID Ptr,
SIZE_T Size);
+BOOLEAN NTAPI
+RtlpPageHeapLock(HANDLE HeapPtr);
+
+BOOLEAN NTAPI
+RtlpPageHeapUnlock(HANDLE HeapPtr);
+
BOOLEAN NTAPI
RtlpPageHeapGetUserInfo(PVOID HeapHandle,
ULONG Flags,
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 */