mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 21:53:06 +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;
|
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 */
|
/* Check if it's really a heap */
|
||||||
if (Heap->Signature != HEAP_SIGNATURE) return FALSE;
|
if (Heap->Signature != HEAP_SIGNATURE) return FALSE;
|
||||||
|
@ -3015,7 +3019,11 @@ RtlUnlockHeap(HANDLE HeapPtr)
|
||||||
{
|
{
|
||||||
PHEAP Heap = (PHEAP)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 */
|
/* Check if it's really a heap */
|
||||||
if (Heap->Signature != HEAP_SIGNATURE) return FALSE;
|
if (Heap->Signature != HEAP_SIGNATURE) return FALSE;
|
||||||
|
|
|
@ -435,6 +435,12 @@ RtlpPageHeapReAllocate(HANDLE HeapPtr,
|
||||||
PVOID Ptr,
|
PVOID Ptr,
|
||||||
SIZE_T Size);
|
SIZE_T Size);
|
||||||
|
|
||||||
|
BOOLEAN NTAPI
|
||||||
|
RtlpPageHeapLock(HANDLE HeapPtr);
|
||||||
|
|
||||||
|
BOOLEAN NTAPI
|
||||||
|
RtlpPageHeapUnlock(HANDLE HeapPtr);
|
||||||
|
|
||||||
BOOLEAN NTAPI
|
BOOLEAN NTAPI
|
||||||
RtlpPageHeapGetUserInfo(PVOID HeapHandle,
|
RtlpPageHeapGetUserInfo(PVOID HeapHandle,
|
||||||
ULONG Flags,
|
ULONG Flags,
|
||||||
|
|
|
@ -2349,4 +2349,32 @@ RtlpDphNormalHeapValidate(PDPH_HEAP_ROOT DphRoot,
|
||||||
return RtlValidateHeap(DphRoot->NormalHeap, Flags, BlockInfo);
|
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 */
|
/* EOF */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue