1 #include "k32_vista.h"
2 
3 #define NDEBUG
4 #include <debug.h>
5 
6 VOID
7 WINAPI
AcquireSRWLockExclusive(PSRWLOCK Lock)8 AcquireSRWLockExclusive(PSRWLOCK Lock)
9 {
10     RtlAcquireSRWLockExclusive((PRTL_SRWLOCK)Lock);
11 }
12 
13 VOID
14 WINAPI
AcquireSRWLockShared(PSRWLOCK Lock)15 AcquireSRWLockShared(PSRWLOCK Lock)
16 {
17     RtlAcquireSRWLockShared((PRTL_SRWLOCK)Lock);
18 }
19 
20 VOID
21 WINAPI
InitializeConditionVariable(PCONDITION_VARIABLE ConditionVariable)22 InitializeConditionVariable(PCONDITION_VARIABLE ConditionVariable)
23 {
24     RtlInitializeConditionVariable((PRTL_CONDITION_VARIABLE)ConditionVariable);
25 }
26 
27 VOID
28 WINAPI
InitializeSRWLock(PSRWLOCK Lock)29 InitializeSRWLock(PSRWLOCK Lock)
30 {
31     RtlInitializeSRWLock((PRTL_SRWLOCK)Lock);
32 }
33 
34 VOID
35 WINAPI
ReleaseSRWLockExclusive(PSRWLOCK Lock)36 ReleaseSRWLockExclusive(PSRWLOCK Lock)
37 {
38     RtlReleaseSRWLockExclusive((PRTL_SRWLOCK)Lock);
39 }
40 
41 VOID
42 WINAPI
ReleaseSRWLockShared(PSRWLOCK Lock)43 ReleaseSRWLockShared(PSRWLOCK Lock)
44 {
45     RtlReleaseSRWLockShared((PRTL_SRWLOCK)Lock);
46 }
47 
48 FORCEINLINE
49 PLARGE_INTEGER
GetNtTimeout(PLARGE_INTEGER Time,DWORD Timeout)50 GetNtTimeout(PLARGE_INTEGER Time, DWORD Timeout)
51 {
52     if (Timeout == INFINITE) return NULL;
53     Time->QuadPart = (ULONGLONG)Timeout * -10000;
54     return Time;
55 }
56 
57 BOOL
58 WINAPI
SleepConditionVariableCS(PCONDITION_VARIABLE ConditionVariable,PCRITICAL_SECTION CriticalSection,DWORD Timeout)59 SleepConditionVariableCS(PCONDITION_VARIABLE ConditionVariable, PCRITICAL_SECTION CriticalSection, DWORD Timeout)
60 {
61     NTSTATUS Status;
62     LARGE_INTEGER Time;
63 
64     Status = RtlSleepConditionVariableCS(ConditionVariable, (PRTL_CRITICAL_SECTION)CriticalSection, GetNtTimeout(&Time, Timeout));
65     if (!NT_SUCCESS(Status) || Status == STATUS_TIMEOUT)
66     {
67         SetLastError(RtlNtStatusToDosError(Status));
68         return FALSE;
69     }
70     return TRUE;
71 }
72 
73 BOOL
74 WINAPI
SleepConditionVariableSRW(PCONDITION_VARIABLE ConditionVariable,PSRWLOCK Lock,DWORD Timeout,ULONG Flags)75 SleepConditionVariableSRW(PCONDITION_VARIABLE ConditionVariable, PSRWLOCK Lock, DWORD Timeout, ULONG Flags)
76 {
77     NTSTATUS Status;
78     LARGE_INTEGER Time;
79 
80     Status = RtlSleepConditionVariableSRW(ConditionVariable, Lock, GetNtTimeout(&Time, Timeout), Flags);
81     if (!NT_SUCCESS(Status) || Status == STATUS_TIMEOUT)
82     {
83         SetLastError(RtlNtStatusToDosError(Status));
84         return FALSE;
85     }
86     return TRUE;
87 }
88 
89 VOID
90 WINAPI
WakeAllConditionVariable(PCONDITION_VARIABLE ConditionVariable)91 WakeAllConditionVariable(PCONDITION_VARIABLE ConditionVariable)
92 {
93     RtlWakeAllConditionVariable((PRTL_CONDITION_VARIABLE)ConditionVariable);
94 }
95 
96 VOID
97 WINAPI
WakeConditionVariable(PCONDITION_VARIABLE ConditionVariable)98 WakeConditionVariable(PCONDITION_VARIABLE ConditionVariable)
99 {
100     RtlWakeConditionVariable((PRTL_CONDITION_VARIABLE)ConditionVariable);
101 }
102 
103 
104 /*
105 * @implemented
106 */
InitializeCriticalSectionEx(OUT LPCRITICAL_SECTION lpCriticalSection,IN DWORD dwSpinCount,IN DWORD flags)107 BOOL WINAPI InitializeCriticalSectionEx(OUT LPCRITICAL_SECTION lpCriticalSection,
108                                         IN DWORD dwSpinCount,
109                                         IN DWORD flags)
110 {
111     NTSTATUS Status;
112 
113     /* FIXME: Flags ignored */
114 
115     /* Initialize the critical section */
116     Status = RtlInitializeCriticalSectionAndSpinCount(
117         (PRTL_CRITICAL_SECTION)lpCriticalSection,
118         dwSpinCount);
119     if (!NT_SUCCESS(Status))
120     {
121         /* Set failure code */
122         SetLastError(RtlNtStatusToDosError(Status));
123         return FALSE;
124     }
125 
126     /* Success */
127     return TRUE;
128 }
129 
130