Module: wine Branch: master Commit: 1d3e3a1c8d08c75e88734ec00b5a2b412e8d6ca3 URL: https://source.winehq.org/git/wine.git/?a=commit;h=1d3e3a1c8d08c75e88734ec00...
Author: Alexandre Julliard julliard@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@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; }