From bb92d36109c9d4931051c69c0ab789b5c1396e66 Mon Sep 17 00:00:00 2001 From: Sebastian Lackner Date: Sat, 5 Aug 2017 03:38:38 +0200 Subject: [PATCH] ntdll: Add inline versions of RtlEnterCriticalSection / RtlLeaveCriticalSections. --- dlls/ntdll/ntdll_misc.h | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h index 27e7141bc65..d1fe4ba99d0 100644 --- a/dlls/ntdll/ntdll_misc.h +++ b/dlls/ntdll/ntdll_misc.h @@ -28,6 +28,7 @@ #include "winnt.h" #include "winternl.h" #include "unixlib.h" +#include "wine/debug.h" #include "wine/server.h" #include "wine/asm.h" @@ -237,6 +238,43 @@ extern int ntdll_wcstoumbs( const WCHAR* src, DWORD srclen, char* dst, DWORD dst extern int CDECL NTDLL__vsnprintf( char *str, SIZE_T len, const char *format, __ms_va_list args ) DECLSPEC_HIDDEN; extern int CDECL NTDLL__vsnwprintf( WCHAR *str, SIZE_T len, const WCHAR *format, __ms_va_list args ) DECLSPEC_HIDDEN; +#ifdef __WINE_WINE_PORT_H + +/* inline version of RtlEnterCriticalSection */ +static inline void enter_critical_section( RTL_CRITICAL_SECTION *crit ) +{ + if (InterlockedIncrement( &crit->LockCount )) + { + if (crit->OwningThread == ULongToHandle(GetCurrentThreadId())) + { + crit->RecursionCount++; + return; + } + RtlpWaitForCriticalSection( crit ); + } + crit->OwningThread = ULongToHandle(GetCurrentThreadId()); + crit->RecursionCount = 1; +} + +/* inline version of RtlLeaveCriticalSection */ +static inline void leave_critical_section( RTL_CRITICAL_SECTION *crit ) +{ + WINE_DECLARE_DEBUG_CHANNEL(ntdll); + if (--crit->RecursionCount) + { + if (crit->RecursionCount > 0) InterlockedDecrement( &crit->LockCount ); + else ERR_(ntdll)( "section %p is not acquired\n", crit ); + } + else + { + crit->OwningThread = 0; + if (InterlockedDecrement( &crit->LockCount ) >= 0) + RtlpUnWaitCriticalSection( crit ); + } +} + +#endif /* __WINE_WINE_PORT_H */ + /* load order */ enum loadorder -- 2.26.2