mirror of
https://github.com/reactos/reactos.git
synced 2024-10-02 15:34:13 +00:00
[KERNEL32_VISTA]
Add Kernel32 implementation for SRW locks and condition variables. This is based on Wine implementation. CORE-7546 CORE-8204 svn path=/trunk/; revision=74705
This commit is contained in:
parent
379c7825ec
commit
038c2e6ca0
|
@ -10,10 +10,11 @@ list(APPEND SOURCE
|
||||||
GetFileInformationByHandleEx.c
|
GetFileInformationByHandleEx.c
|
||||||
GetTickCount64.c
|
GetTickCount64.c
|
||||||
InitOnceExecuteOnce.c
|
InitOnceExecuteOnce.c
|
||||||
|
sync.c
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/kernel32_vista.def)
|
${CMAKE_CURRENT_BINARY_DIR}/kernel32_vista.def)
|
||||||
|
|
||||||
add_library(kernel32_vista SHARED ${SOURCE})
|
add_library(kernel32_vista SHARED ${SOURCE})
|
||||||
set_module_type(kernel32_vista win32dll ENTRYPOINT DllMain 12)
|
set_module_type(kernel32_vista win32dll ENTRYPOINT DllMain 12)
|
||||||
add_importlibs(kernel32_vista kernel32 ntdll)
|
add_importlibs(kernel32_vista kernel32 ntdll_vista ntdll)
|
||||||
add_dependencies(kernel32_vista psdk)
|
add_dependencies(kernel32_vista psdk)
|
||||||
add_cd_file(TARGET kernel32_vista DESTINATION reactos/system32 FOR all)
|
add_cd_file(TARGET kernel32_vista DESTINATION reactos/system32 FOR all)
|
||||||
|
|
|
@ -2,3 +2,15 @@
|
||||||
@ stdcall InitOnceExecuteOnce(ptr ptr ptr ptr)
|
@ stdcall InitOnceExecuteOnce(ptr ptr ptr ptr)
|
||||||
@ stdcall GetFileInformationByHandleEx(long long ptr long)
|
@ stdcall GetFileInformationByHandleEx(long long ptr long)
|
||||||
@ stdcall -ret64 GetTickCount64()
|
@ stdcall -ret64 GetTickCount64()
|
||||||
|
|
||||||
|
@ stdcall InitializeSRWLock(ptr)
|
||||||
|
@ stdcall AcquireSRWLockExclusive(ptr)
|
||||||
|
@ stdcall AcquireSRWLockShared(ptr)
|
||||||
|
@ stdcall ReleaseSRWLockExclusive(ptr)
|
||||||
|
@ stdcall ReleaseSRWLockShared(ptr)
|
||||||
|
|
||||||
|
@ stdcall InitializeConditionVariable(ptr)
|
||||||
|
@ stdcall SleepConditionVariableCS(ptr ptr long)
|
||||||
|
@ stdcall SleepConditionVariableSRW(ptr ptr long long)
|
||||||
|
@ stdcall WakeAllConditionVariable(ptr)
|
||||||
|
@ stdcall WakeConditionVariable(ptr)
|
||||||
|
|
150
reactos/dll/win32/kernel32_vista/sync.c
Normal file
150
reactos/dll/win32/kernel32_vista/sync.c
Normal file
|
@ -0,0 +1,150 @@
|
||||||
|
#include "k32_vista.h"
|
||||||
|
|
||||||
|
#define NDEBUG
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
|
VOID
|
||||||
|
NTAPI
|
||||||
|
RtlInitializeConditionVariable(OUT PRTL_CONDITION_VARIABLE ConditionVariable);
|
||||||
|
|
||||||
|
VOID
|
||||||
|
NTAPI
|
||||||
|
RtlWakeConditionVariable(IN OUT PRTL_CONDITION_VARIABLE ConditionVariable);
|
||||||
|
|
||||||
|
VOID
|
||||||
|
NTAPI
|
||||||
|
RtlWakeAllConditionVariable(IN OUT PRTL_CONDITION_VARIABLE ConditionVariable);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
RtlSleepConditionVariableCS(IN OUT PRTL_CONDITION_VARIABLE ConditionVariable,
|
||||||
|
IN OUT PRTL_CRITICAL_SECTION CriticalSection,
|
||||||
|
IN PLARGE_INTEGER TimeOut OPTIONAL);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
RtlSleepConditionVariableSRW(IN OUT PRTL_CONDITION_VARIABLE ConditionVariable,
|
||||||
|
IN OUT PRTL_SRWLOCK SRWLock,
|
||||||
|
IN PLARGE_INTEGER TimeOut OPTIONAL,
|
||||||
|
IN ULONG Flags);
|
||||||
|
|
||||||
|
VOID
|
||||||
|
NTAPI
|
||||||
|
RtlInitializeSRWLock(OUT PRTL_SRWLOCK SRWLock);
|
||||||
|
|
||||||
|
VOID
|
||||||
|
NTAPI
|
||||||
|
RtlAcquireSRWLockShared(IN OUT PRTL_SRWLOCK SRWLock);
|
||||||
|
|
||||||
|
VOID
|
||||||
|
NTAPI
|
||||||
|
RtlReleaseSRWLockShared(IN OUT PRTL_SRWLOCK SRWLock);
|
||||||
|
|
||||||
|
VOID
|
||||||
|
NTAPI
|
||||||
|
RtlAcquireSRWLockExclusive(IN OUT PRTL_SRWLOCK SRWLock);
|
||||||
|
|
||||||
|
VOID
|
||||||
|
NTAPI
|
||||||
|
RtlReleaseSRWLockExclusive(IN OUT PRTL_SRWLOCK SRWLock);
|
||||||
|
|
||||||
|
ULONG
|
||||||
|
NTAPI
|
||||||
|
RtlNtStatusToDosError(IN NTSTATUS Status);
|
||||||
|
|
||||||
|
VOID
|
||||||
|
WINAPI
|
||||||
|
AcquireSRWLockExclusive(PSRWLOCK Lock)
|
||||||
|
{
|
||||||
|
RtlAcquireSRWLockExclusive((PRTL_SRWLOCK)Lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
WINAPI
|
||||||
|
AcquireSRWLockShared(PSRWLOCK Lock)
|
||||||
|
{
|
||||||
|
RtlAcquireSRWLockShared((PRTL_SRWLOCK)Lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
WINAPI
|
||||||
|
InitializeConditionVariable(PCONDITION_VARIABLE ConditionVariable)
|
||||||
|
{
|
||||||
|
RtlInitializeConditionVariable((PRTL_CONDITION_VARIABLE)ConditionVariable);
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
WINAPI
|
||||||
|
InitializeSRWLock(PSRWLOCK Lock)
|
||||||
|
{
|
||||||
|
RtlInitializeSRWLock((PRTL_SRWLOCK)Lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
WINAPI
|
||||||
|
ReleaseSRWLockExclusive(PSRWLOCK Lock)
|
||||||
|
{
|
||||||
|
RtlReleaseSRWLockExclusive((PRTL_SRWLOCK)Lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
WINAPI
|
||||||
|
ReleaseSRWLockShared(PSRWLOCK Lock)
|
||||||
|
{
|
||||||
|
RtlReleaseSRWLockShared((PRTL_SRWLOCK)Lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
FORCEINLINE
|
||||||
|
PLARGE_INTEGER
|
||||||
|
GetNtTimeout(PLARGE_INTEGER Time, DWORD Timeout)
|
||||||
|
{
|
||||||
|
if (Timeout == INFINITE) return NULL;
|
||||||
|
Time->QuadPart = (ULONGLONG)Timeout * -10000;
|
||||||
|
return Time;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL
|
||||||
|
WINAPI
|
||||||
|
SleepConditionVariableCS(PCONDITION_VARIABLE ConditionVariable, PCRITICAL_SECTION CriticalSection, DWORD Timeout)
|
||||||
|
{
|
||||||
|
NTSTATUS Status;
|
||||||
|
LARGE_INTEGER Time;
|
||||||
|
|
||||||
|
Status = RtlSleepConditionVariableCS(ConditionVariable, (PRTL_CRITICAL_SECTION)CriticalSection, GetNtTimeout(&Time, Timeout));
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
SetLastError(RtlNtStatusToDosError(Status));
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL
|
||||||
|
WINAPI
|
||||||
|
SleepConditionVariableSRW(PCONDITION_VARIABLE ConditionVariable, PSRWLOCK Lock, DWORD Timeout, ULONG Flags)
|
||||||
|
{
|
||||||
|
NTSTATUS Status;
|
||||||
|
LARGE_INTEGER Time;
|
||||||
|
|
||||||
|
Status = RtlSleepConditionVariableSRW(ConditionVariable, Lock, GetNtTimeout(&Time, Timeout), Flags);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
SetLastError(RtlNtStatusToDosError(Status));
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
WINAPI
|
||||||
|
WakeAllConditionVariable(PCONDITION_VARIABLE ConditionVariable)
|
||||||
|
{
|
||||||
|
RtlWakeAllConditionVariable((PRTL_CONDITION_VARIABLE)ConditionVariable);
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
WINAPI
|
||||||
|
WakeConditionVariable(PCONDITION_VARIABLE ConditionVariable)
|
||||||
|
{
|
||||||
|
RtlWakeConditionVariable((PRTL_CONDITION_VARIABLE)ConditionVariable);
|
||||||
|
}
|
Loading…
Reference in a new issue