Module: wine Branch: master Commit: 7c46763ea786293ad93e44fe0658fbe1bf188a63 URL: http://source.winehq.org/git/wine.git/?a=commit;h=7c46763ea786293ad93e44fe06...
Author: Sebastian Lackner sebastian@fds-team.de Date: Sat Oct 10 05:39:50 2015 +0200
ntdll: Implement RtlIsCriticalSectionLocked[ByThread].
Signed-off-by: Sebastian Lackner sebastian@fds-team.de Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ntdll/critsection.c | 37 +++++++++++++++++++++++++++++++++++++ dlls/ntdll/ntdll.spec | 2 ++ dlls/ntdll/tests/rtl.c | 2 +- include/winternl.h | 2 ++ 4 files changed, 42 insertions(+), 1 deletion(-)
diff --git a/dlls/ntdll/critsection.c b/dlls/ntdll/critsection.c index 6e0332b..e2eb364 100644 --- a/dlls/ntdll/critsection.c +++ b/dlls/ntdll/critsection.c @@ -610,6 +610,43 @@ BOOL WINAPI RtlTryEnterCriticalSection( RTL_CRITICAL_SECTION *crit )
/*********************************************************************** + * RtlIsCriticalSectionLocked (NTDLL.@) + * + * Checks if the critical section is locked by any thread. + * + * PARAMS + * crit [I/O] Critical section to check. + * + * RETURNS + * Success: TRUE. The critical section is locked. + * Failure: FALSE. The critical section is not locked. + */ +BOOL WINAPI RtlIsCriticalSectionLocked( RTL_CRITICAL_SECTION *crit ) +{ + return crit->RecursionCount != 0; +} + + +/*********************************************************************** + * RtlIsCriticalSectionLockedByThread (NTDLL.@) + * + * Checks if the critical section is locked by the current thread. + * + * PARAMS + * crit [I/O] Critical section to check. + * + * RETURNS + * Success: TRUE. The critical section is locked. + * Failure: FALSE. The critical section is not locked. + */ +BOOL WINAPI RtlIsCriticalSectionLockedByThread( RTL_CRITICAL_SECTION *crit ) +{ + return crit->OwningThread == ULongToHandle(GetCurrentThreadId()) && + crit->RecursionCount; +} + + +/*********************************************************************** * RtlLeaveCriticalSection (NTDLL.@) * * Leaves a critical section. diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec index 6b3fc65..7f07b14 100644 --- a/dlls/ntdll/ntdll.spec +++ b/dlls/ntdll/ntdll.spec @@ -719,6 +719,8 @@ # @ stub RtlIpv6StringToAddressExW # @ stub RtlIpv6StringToAddressW @ stdcall RtlIsActivationContextActive(ptr) +@ stdcall RtlIsCriticalSectionLocked(ptr) +@ stdcall RtlIsCriticalSectionLockedByThread(ptr) @ stdcall RtlIsDosDeviceName_U(wstr) @ stub RtlIsGenericTableEmpty # @ stub RtlIsGenericTableEmptyAvl diff --git a/dlls/ntdll/tests/rtl.c b/dlls/ntdll/tests/rtl.c index 4ab3d1e..0f79f7d 100644 --- a/dlls/ntdll/tests/rtl.c +++ b/dlls/ntdll/tests/rtl.c @@ -2008,7 +2008,7 @@ static void test_RtlIsCriticalSectionLocked(void)
if (!pRtlIsCriticalSectionLocked || !pRtlIsCriticalSectionLockedByThread) { - skip("skipping RtlIsCriticalSectionLocked tests, required functions not available\n"); + win_skip("skipping RtlIsCriticalSectionLocked tests, required functions not available\n"); return; }
diff --git a/include/winternl.h b/include/winternl.h index 3e64b4d..e76114e 100644 --- a/include/winternl.h +++ b/include/winternl.h @@ -2483,6 +2483,8 @@ NTSYSAPI NTSTATUS WINAPI RtlInt64ToUnicodeString(ULONGLONG,ULONG,UNICODE_STRING NTSYSAPI NTSTATUS WINAPI RtlIntegerToChar(ULONG,ULONG,ULONG,PCHAR); NTSYSAPI NTSTATUS WINAPI RtlIntegerToUnicodeString(ULONG,ULONG,UNICODE_STRING *); NTSYSAPI BOOLEAN WINAPI RtlIsActivationContextActive(HANDLE); +NTSYSAPI BOOL WINAPI RtlIsCriticalSectionLocked(RTL_CRITICAL_SECTION *); +NTSYSAPI BOOL WINAPI RtlIsCriticalSectionLockedByThread(RTL_CRITICAL_SECTION *); NTSYSAPI ULONG WINAPI RtlIsDosDeviceName_U(PCWSTR); NTSYSAPI BOOLEAN WINAPI RtlIsNameLegalDOS8Dot3(const UNICODE_STRING*,POEM_STRING,PBOOLEAN); NTSYSAPI BOOLEAN WINAPI RtlIsTextUnicode(LPCVOID,INT,INT *);