Alexandre Julliard : ntdll: Avoid importing RtlEnterCriticalSection/RtlLeaveCriticalSection from the Unix side.
Alexandre Julliard
julliard at winehq.org
Wed Aug 5 16:05:00 CDT 2020
Module: wine
Branch: master
Commit: 1d3e3a1c8d08c75e88734ec00b5a2b412e8d6ca3
URL: https://source.winehq.org/git/wine.git/?a=commit;h=1d3e3a1c8d08c75e88734ec00b5a2b412e8d6ca3
Author: Alexandre Julliard <julliard at winehq.org>
Date: Wed Aug 5 15:28:23 2020 +0200
ntdll: Avoid importing RtlEnterCriticalSection/RtlLeaveCriticalSection from the Unix side.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/ntdll/unix/sync.c | 17 ++++++++++++++---
1 file changed, 14 insertions(+), 3 deletions(-)
diff --git a/dlls/ntdll/unix/sync.c b/dlls/ntdll/unix/sync.c
index e7e13a6c7e..23dca9c61b 100644
--- a/dlls/ntdll/unix/sync.c
+++ b/dlls/ntdll/unix/sync.c
@@ -2522,9 +2522,20 @@ NTSTATUS CDECL fast_RtlSleepConditionVariableCS( RTL_CONDITION_VARIABLE *variabl
val = *futex;
- RtlLeaveCriticalSection( cs );
- status = wait_cv( futex, val, timeout );
- RtlEnterCriticalSection( cs );
+ if (cs->RecursionCount == 1)
+ {
+ /* FIXME: simplified version of RtlLeaveCriticalSection/RtlEnterCriticalSection to avoid imports */
+ cs->RecursionCount = 0;
+ cs->OwningThread = 0;
+ if (InterlockedDecrement( &cs->LockCount ) >= 0) fast_RtlpUnWaitCriticalSection( cs );
+
+ status = wait_cv( futex, val, timeout );
+
+ if (InterlockedIncrement( &cs->LockCount )) fast_RtlpWaitForCriticalSection( cs, INT_MAX );
+ cs->OwningThread = ULongToHandle( GetCurrentThreadId() );
+ cs->RecursionCount = 1;
+ }
+ else status = wait_cv( futex, val, timeout );
return status;
}
More information about the wine-cvs
mailing list