mirror of
https://github.com/reactos/reactos.git
synced 2025-08-03 14:05:42 +00:00
[RTL]
- 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
This commit is contained in:
parent
03a1f14142
commit
60382e46c8
3 changed files with 44 additions and 2 deletions
|
@ -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;
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue