2 * PROJECT: ReactOS Win32 Base API
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: dll/win32/kernel32/synch/wait.c
5 * PURPOSE: Wrappers for the NT Wait Implementation
6 * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org)
9 /* INCLUDES *****************************************************************/
16 /* FUNCTIONS *****************************************************************/
23 WaitForSingleObject(IN HANDLE hHandle
,
24 IN DWORD dwMilliseconds
)
26 /* Call the extended API */
27 return WaitForSingleObjectEx(hHandle
, dwMilliseconds
, FALSE
);
35 WaitForSingleObjectEx(IN HANDLE hHandle
,
36 IN DWORD dwMilliseconds
,
39 PLARGE_INTEGER TimePtr
;
44 hHandle
= TranslateStdHandle(hHandle
);
46 /* Check for console handle */
47 if ((IsConsoleHandle(hHandle
)) && (VerifyConsoleIoHandle(hHandle
)))
49 /* Get the real wait handle */
50 hHandle
= GetConsoleInputWaitHandle();
53 /* Check if this is an infinite wait */
54 if (dwMilliseconds
== INFINITE
)
56 /* Under NT, this means no timer argument */
61 /* Otherwise, convert the time to NT Format */
62 Time
.QuadPart
= UInt32x32To64(-10000, dwMilliseconds
);
70 Status
= NtWaitForSingleObject(hHandle
, (BOOLEAN
)bAlertable
, TimePtr
);
71 if (!NT_SUCCESS(Status
))
74 SetLastErrorByStatus (Status
);
77 } while ((Status
== STATUS_ALERTED
) && (bAlertable
));
79 /* Return wait status */
88 WaitForMultipleObjects(IN DWORD nCount
,
89 IN CONST HANDLE
*lpHandles
,
91 IN DWORD dwMilliseconds
)
93 /* Call the extended API */
94 return WaitForMultipleObjectsEx(nCount
,
106 WaitForMultipleObjectsEx(IN DWORD nCount
,
107 IN CONST HANDLE
*lpHandles
,
109 IN DWORD dwMilliseconds
,
112 PLARGE_INTEGER TimePtr
;
114 PHANDLE HandleBuffer
;
119 /* Check if we have more handles then we locally optimize */
122 /* Allocate a buffer for them */
123 HandleBuffer
= RtlAllocateHeap(RtlGetProcessHeap(),
125 nCount
* sizeof(HANDLE
));
128 /* No buffer, fail the wait */
129 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
135 /* Otherwise, use our local buffer */
136 HandleBuffer
= Handle
;
139 /* Copy the handles into our buffer and loop them all */
140 RtlCopyMemory(HandleBuffer
, (LPVOID
)lpHandles
, nCount
* sizeof(HANDLE
));
141 for (i
= 0; i
< nCount
; i
++)
143 /* Check what kind of handle this is */
144 HandleBuffer
[i
] = TranslateStdHandle(HandleBuffer
[i
]);
146 /* Check for console handle */
147 if ((IsConsoleHandle(HandleBuffer
[i
])) &&
148 (VerifyConsoleIoHandle(HandleBuffer
[i
])))
150 /* Get the real wait handle */
151 HandleBuffer
[i
] = GetConsoleInputWaitHandle();
155 /* Check if this is an infinite wait */
156 if (dwMilliseconds
== INFINITE
)
158 /* Under NT, this means no timer argument */
163 /* Otherwise, convert the time to NT Format */
164 Time
.QuadPart
= UInt32x32To64(-10000, dwMilliseconds
);
168 /* Start wait loop */
172 Status
= NtWaitForMultipleObjects(nCount
,
174 bWaitAll
? WaitAll
: WaitAny
,
177 if (!NT_SUCCESS(Status
))
180 SetLastErrorByStatus (Status
);
183 } while ((Status
== STATUS_ALERTED
) && (bAlertable
));
185 /* Check if we didn't use our local buffer */
186 if (HandleBuffer
!= Handle
)
188 /* Free the allocated one */
189 RtlFreeHeap(RtlGetProcessHeap(), 0, HandleBuffer
);
192 /* Return wait status */
201 SignalObjectAndWait(IN HANDLE hObjectToSignal
,
202 IN HANDLE hObjectToWaitOn
,
203 IN DWORD dwMilliseconds
,
206 PLARGE_INTEGER TimePtr
;
210 /* Get real handle */
211 hObjectToWaitOn
= TranslateStdHandle(hObjectToWaitOn
);
213 /* Check for console handle */
214 if ((IsConsoleHandle(hObjectToWaitOn
)) &&
215 (VerifyConsoleIoHandle(hObjectToWaitOn
)))
217 /* Get the real wait handle */
218 hObjectToWaitOn
= GetConsoleInputWaitHandle();
221 /* Check if this is an infinite wait */
222 if (dwMilliseconds
== INFINITE
)
224 /* Under NT, this means no timer argument */
229 /* Otherwise, convert the time to NT Format */
230 Time
.QuadPart
= UInt32x32To64(-10000, dwMilliseconds
);
234 /* Start wait loop */
238 Status
= NtSignalAndWaitForSingleObject(hObjectToSignal
,
242 if (!NT_SUCCESS(Status
))
244 /* The wait failed */
245 SetLastErrorByStatus (Status
);
248 } while ((Status
== STATUS_ALERTED
) && (bAlertable
));
250 /* Return wait status */