From faa70e3d70d9ae6baca86e5749131b541c2d7d51 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Tue, 5 Oct 2010 12:42:55 +0000 Subject: [PATCH] [HEAP] - Move on to using a real HEAP_LOCK structure for a heap lock. - Implement kernel-mode counterparts of this lock too. Right now these don't introduce much of a difference, but they are going to be properly used by the new heap manager code. svn path=/trunk/; revision=48994 --- reactos/dll/ntdll/rtl/libsupp.c | 16 ++++++++-------- reactos/include/ndk/rtltypes.h | 15 +++++++++++++++ reactos/ntoskrnl/rtl/libsupp.c | 19 +++++++++---------- 3 files changed, 32 insertions(+), 18 deletions(-) diff --git a/reactos/dll/ntdll/rtl/libsupp.c b/reactos/dll/ntdll/rtl/libsupp.c index 47e4359e054..5237098df27 100644 --- a/reactos/dll/ntdll/rtl/libsupp.c +++ b/reactos/dll/ntdll/rtl/libsupp.c @@ -113,33 +113,33 @@ RtlGetNtGlobalFlags(VOID) NTSTATUS NTAPI RtlDeleteHeapLock( - PRTL_CRITICAL_SECTION CriticalSection) + PHEAP_LOCK Lock) { - return RtlDeleteCriticalSection(CriticalSection); + return RtlDeleteCriticalSection(&Lock->CriticalSection); } NTSTATUS NTAPI RtlEnterHeapLock( - PRTL_CRITICAL_SECTION CriticalSection) + PHEAP_LOCK Lock) { - return RtlEnterCriticalSection(CriticalSection); + return RtlEnterCriticalSection(&Lock->CriticalSection); } NTSTATUS NTAPI RtlInitializeHeapLock( - PRTL_CRITICAL_SECTION CriticalSection) + PHEAP_LOCK Lock) { - return RtlInitializeCriticalSection(CriticalSection); + return RtlInitializeCriticalSection(&Lock->CriticalSection); } NTSTATUS NTAPI RtlLeaveHeapLock( - PRTL_CRITICAL_SECTION CriticalSection) + PHEAP_LOCK Lock) { - return RtlLeaveCriticalSection(CriticalSection ); + return RtlLeaveCriticalSection(&Lock->CriticalSection); } PVOID diff --git a/reactos/include/ndk/rtltypes.h b/reactos/include/ndk/rtltypes.h index 04aa9242624..afcf61dfba0 100644 --- a/reactos/include/ndk/rtltypes.h +++ b/reactos/include/ndk/rtltypes.h @@ -1039,6 +1039,21 @@ typedef struct _RTL_CRITICAL_SECTION #endif +// +// RTL Private Heap Structures +// +typedef struct _HEAP_LOCK +{ + union + { + RTL_CRITICAL_SECTION CriticalSection; +#ifndef NTOS_MODE_USER + ERESOURCE Resource; +#endif + UCHAR Padding[0x68]; /* Max ERESOURCE size for x64 build. Needed because RTL is built only once */ + }; +} HEAP_LOCK, *PHEAP_LOCK; + // // RTL Range List Structures // diff --git a/reactos/ntoskrnl/rtl/libsupp.c b/reactos/ntoskrnl/rtl/libsupp.c index aba04f1042e..5f9e0c10d5a 100644 --- a/reactos/ntoskrnl/rtl/libsupp.c +++ b/reactos/ntoskrnl/rtl/libsupp.c @@ -157,36 +157,35 @@ RtlGetCurrentPeb(VOID) NTSTATUS NTAPI RtlDeleteHeapLock( - PRTL_CRITICAL_SECTION CriticalSection) + PHEAP_LOCK Lock) { - ASSERT(FALSE); + ExDeleteResource(&Lock->Resource); return STATUS_SUCCESS; } NTSTATUS NTAPI RtlEnterHeapLock( - PRTL_CRITICAL_SECTION CriticalSection) + PHEAP_LOCK Lock) { - ASSERT(FALSE); - return STATUS_SUCCESS; + return ExAcquireResourceExclusive(&Lock->Resource, TRUE); } NTSTATUS NTAPI RtlInitializeHeapLock( - PRTL_CRITICAL_SECTION CriticalSection) + PHEAP_LOCK Lock) { - ASSERT(FALSE); - return STATUS_SUCCESS; + ExInitializeResource(&Lock->Resource); + return STATUS_SUCCESS; } NTSTATUS NTAPI RtlLeaveHeapLock( - PRTL_CRITICAL_SECTION CriticalSection) + PHEAP_LOCK Lock) { - ASSERT(FALSE); + ExReleaseResource(&Lock->Resource); return STATUS_SUCCESS; }