From 33e318ed914e920d2665cbe375e113c0c94f3f89 Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Fri, 24 Oct 2014 19:05:54 +0000 Subject: [PATCH] [RTL] - Implement RtlTryEnterHeapLock and use it to fix RtlpDphEnterCriticalSection svn path=/trunk/; revision=64970 --- reactos/dll/ntdll/rtl/libsupp.c | 9 +++++++++ reactos/lib/rtl/heappage.c | 2 +- reactos/lib/rtl/rtlp.h | 4 ++++ reactos/ntoskrnl/rtl/libsupp.c | 18 ++++++++++++++++++ 4 files changed, 32 insertions(+), 1 deletion(-) diff --git a/reactos/dll/ntdll/rtl/libsupp.c b/reactos/dll/ntdll/rtl/libsupp.c index 22c6811b91b..43276aee74b 100644 --- a/reactos/dll/ntdll/rtl/libsupp.c +++ b/reactos/dll/ntdll/rtl/libsupp.c @@ -127,6 +127,15 @@ RtlEnterHeapLock(IN OUT PHEAP_LOCK Lock, IN BOOLEAN Exclusive) return RtlEnterCriticalSection(&Lock->CriticalSection); } +BOOLEAN +NTAPI +RtlTryEnterHeapLock(IN OUT PHEAP_LOCK Lock, IN BOOLEAN Exclusive) +{ + UNREFERENCED_PARAMETER(Exclusive); + + return RtlTryEnterCriticalSection(&Lock->CriticalSection); +} + NTSTATUS NTAPI RtlInitializeHeapLock(IN OUT PHEAP_LOCK *Lock) diff --git a/reactos/lib/rtl/heappage.c b/reactos/lib/rtl/heappage.c index 1cc3099b6b6..696fcda309b 100644 --- a/reactos/lib/rtl/heappage.c +++ b/reactos/lib/rtl/heappage.c @@ -236,7 +236,7 @@ RtlpDphEnterCriticalSection(PDPH_HEAP_ROOT DphRoot, ULONG Flags) if (Flags & HEAP_NO_SERIALIZE) { /* More complex scenario */ - if (!RtlEnterHeapLock(DphRoot->HeapCritSect, TRUE)) + if (!RtlTryEnterHeapLock(DphRoot->HeapCritSect, TRUE)) { if (!DphRoot->nRemoteLockAcquired) { diff --git a/reactos/lib/rtl/rtlp.h b/reactos/lib/rtl/rtlp.h index b9429af356f..a57e78bda4a 100644 --- a/reactos/lib/rtl/rtlp.h +++ b/reactos/lib/rtl/rtlp.h @@ -103,6 +103,10 @@ NTSTATUS NTAPI RtlEnterHeapLock(IN OUT PHEAP_LOCK Lock, IN BOOLEAN Exclusive); +BOOLEAN +NTAPI +RtlTryEnterHeapLock(IN OUT PHEAP_LOCK Lock, IN BOOLEAN Exclusive); + NTSTATUS NTAPI RtlInitializeHeapLock(IN OUT PHEAP_LOCK *Lock); diff --git a/reactos/ntoskrnl/rtl/libsupp.c b/reactos/ntoskrnl/rtl/libsupp.c index b5099a5f2de..fb7dc0db47c 100644 --- a/reactos/ntoskrnl/rtl/libsupp.c +++ b/reactos/ntoskrnl/rtl/libsupp.c @@ -178,6 +178,24 @@ RtlEnterHeapLock(IN OUT PHEAP_LOCK Lock, IN BOOLEAN Exclusive) return STATUS_SUCCESS; } +BOOLEAN +NTAPI +RtlTryEnterHeapLock(IN OUT PHEAP_LOCK Lock, IN BOOLEAN Exclusive) +{ + BOOLEAN Success; + KeEnterCriticalRegion(); + + if (Exclusive) + Success = ExAcquireResourceExclusiveLite(&Lock->Resource, FALSE); + else + Success = ExAcquireResourceSharedLite(&Lock->Resource, FALSE); + + if (!Success) + KeLeaveCriticalRegion(); + + return Success; +} + NTSTATUS NTAPI RtlInitializeHeapLock(IN OUT PHEAP_LOCK *Lock)