2003-02-27 15:40:46 +00:00
|
|
|
/* $Id: wait.c,v 1.20 2003/02/27 15:40:46 gdalsnes Exp $
|
2000-03-16 21:50:11 +00:00
|
|
|
*
|
1998-12-04 18:28:13 +00:00
|
|
|
* COPYRIGHT: See COPYING in the top level directory
|
|
|
|
* PROJECT: ReactOS system libraries
|
|
|
|
* FILE: lib/kernel32/synch/wait.c
|
2001-01-20 12:20:43 +00:00
|
|
|
* PURPOSE: Wait functions
|
1998-12-04 18:28:13 +00:00
|
|
|
* PROGRAMMER: Ariadne ( ariadne@xs4all.nl)
|
|
|
|
* UPDATE HISTORY:
|
|
|
|
* Created 01/11/98
|
|
|
|
*/
|
|
|
|
|
2001-01-20 12:20:43 +00:00
|
|
|
/* INCLUDES *****************************************************************/
|
|
|
|
|
2003-01-15 21:24:36 +00:00
|
|
|
#include <k32.h>
|
1998-12-04 18:28:13 +00:00
|
|
|
|
2001-11-07 02:17:22 +00:00
|
|
|
#define NDEBUG
|
2001-01-20 12:20:43 +00:00
|
|
|
#include <kernel32/kernel32.h>
|
2000-03-16 21:50:11 +00:00
|
|
|
|
2001-01-20 12:20:43 +00:00
|
|
|
/* FUNCTIONS ****************************************************************/
|
1998-12-04 18:28:13 +00:00
|
|
|
|
2001-01-20 12:20:43 +00:00
|
|
|
DWORD STDCALL
|
|
|
|
WaitForSingleObject(HANDLE hHandle,
|
|
|
|
DWORD dwMilliseconds)
|
1998-12-04 18:28:13 +00:00
|
|
|
{
|
2001-01-20 12:20:43 +00:00
|
|
|
return WaitForSingleObjectEx(hHandle,
|
|
|
|
dwMilliseconds,
|
|
|
|
FALSE);
|
1998-12-04 18:28:13 +00:00
|
|
|
}
|
|
|
|
|
1999-09-12 20:54:42 +00:00
|
|
|
|
2001-01-20 12:20:43 +00:00
|
|
|
DWORD STDCALL
|
1999-09-12 20:54:42 +00:00
|
|
|
WaitForSingleObjectEx(HANDLE hHandle,
|
2000-03-16 21:50:11 +00:00
|
|
|
DWORD dwMilliseconds,
|
1999-09-12 20:54:42 +00:00
|
|
|
BOOL bAlertable)
|
1998-12-04 18:28:13 +00:00
|
|
|
{
|
1999-01-04 23:01:18 +00:00
|
|
|
NTSTATUS errCode;
|
|
|
|
PLARGE_INTEGER TimePtr;
|
|
|
|
LARGE_INTEGER Time;
|
1999-09-12 20:54:42 +00:00
|
|
|
|
1999-01-04 23:01:18 +00:00
|
|
|
if (dwMilliseconds == INFINITE)
|
|
|
|
{
|
|
|
|
TimePtr = NULL;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
1999-09-12 20:54:42 +00:00
|
|
|
Time.QuadPart = -10000 * dwMilliseconds;
|
1999-01-04 23:01:18 +00:00
|
|
|
TimePtr = &Time;
|
|
|
|
}
|
1998-12-04 18:28:13 +00:00
|
|
|
|
1999-01-04 23:01:18 +00:00
|
|
|
errCode = NtWaitForSingleObject(hHandle,
|
|
|
|
(BOOLEAN) bAlertable,
|
|
|
|
TimePtr);
|
1999-09-12 20:54:42 +00:00
|
|
|
if (errCode == STATUS_TIMEOUT)
|
|
|
|
{
|
|
|
|
return WAIT_TIMEOUT;
|
|
|
|
}
|
2001-11-08 13:58:13 +00:00
|
|
|
else if ((errCode == WAIT_OBJECT_0) ||
|
|
|
|
(errCode == WAIT_ABANDONED_0))
|
1999-09-12 20:54:42 +00:00
|
|
|
{
|
2001-11-08 13:58:13 +00:00
|
|
|
return(errCode);
|
1999-09-12 20:54:42 +00:00
|
|
|
}
|
|
|
|
|
2000-07-01 17:07:02 +00:00
|
|
|
SetLastErrorByStatus (errCode);
|
1999-09-12 20:54:42 +00:00
|
|
|
|
2001-11-07 02:17:22 +00:00
|
|
|
return(WAIT_FAILED);
|
1998-12-04 18:28:13 +00:00
|
|
|
}
|
|
|
|
|
1999-09-12 20:54:42 +00:00
|
|
|
|
2001-01-20 12:20:43 +00:00
|
|
|
DWORD STDCALL
|
1999-09-12 20:54:42 +00:00
|
|
|
WaitForMultipleObjects(DWORD nCount,
|
|
|
|
CONST HANDLE *lpHandles,
|
|
|
|
BOOL bWaitAll,
|
|
|
|
DWORD dwMilliseconds)
|
1998-12-04 18:28:13 +00:00
|
|
|
{
|
2001-01-20 12:20:43 +00:00
|
|
|
return WaitForMultipleObjectsEx(nCount,
|
|
|
|
lpHandles,
|
2003-02-27 15:40:46 +00:00
|
|
|
bWaitAll,
|
2001-01-20 12:20:43 +00:00
|
|
|
dwMilliseconds,
|
|
|
|
FALSE);
|
1998-12-04 18:28:13 +00:00
|
|
|
}
|
|
|
|
|
1999-09-12 20:54:42 +00:00
|
|
|
|
2001-01-20 12:20:43 +00:00
|
|
|
DWORD STDCALL
|
1999-09-12 20:54:42 +00:00
|
|
|
WaitForMultipleObjectsEx(DWORD nCount,
|
|
|
|
CONST HANDLE *lpHandles,
|
|
|
|
BOOL bWaitAll,
|
|
|
|
DWORD dwMilliseconds,
|
|
|
|
BOOL bAlertable)
|
1998-12-04 18:28:13 +00:00
|
|
|
{
|
1999-09-12 20:54:42 +00:00
|
|
|
NTSTATUS errCode;
|
|
|
|
LARGE_INTEGER Time;
|
|
|
|
PLARGE_INTEGER TimePtr;
|
1998-12-04 18:28:13 +00:00
|
|
|
|
2001-11-07 02:17:22 +00:00
|
|
|
DPRINT("nCount %lu\n", nCount);
|
|
|
|
|
1999-09-12 20:54:42 +00:00
|
|
|
if (dwMilliseconds == INFINITE)
|
|
|
|
{
|
|
|
|
TimePtr = NULL;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
Time.QuadPart = -10000 * dwMilliseconds;
|
|
|
|
TimePtr = &Time;
|
|
|
|
}
|
2000-03-16 21:50:11 +00:00
|
|
|
|
1999-09-12 20:54:42 +00:00
|
|
|
errCode = NtWaitForMultipleObjects (nCount,
|
|
|
|
(PHANDLE)lpHandles,
|
2003-02-27 15:40:46 +00:00
|
|
|
bWaitAll ? WaitAll : WaitAny,
|
1999-09-12 20:54:42 +00:00
|
|
|
(BOOLEAN)bAlertable,
|
|
|
|
TimePtr);
|
|
|
|
|
|
|
|
if (errCode == STATUS_TIMEOUT)
|
|
|
|
{
|
|
|
|
return WAIT_TIMEOUT;
|
|
|
|
}
|
2001-11-07 02:17:22 +00:00
|
|
|
else if (((errCode >= WAIT_OBJECT_0) &&
|
|
|
|
(errCode <= WAIT_OBJECT_0 + nCount - 1)) ||
|
|
|
|
((errCode >= WAIT_ABANDONED_0) &&
|
|
|
|
(errCode <= WAIT_ABANDONED_0 + nCount - 1)))
|
1999-09-12 20:54:42 +00:00
|
|
|
{
|
2001-11-07 02:17:22 +00:00
|
|
|
return(errCode);
|
1999-09-12 20:54:42 +00:00
|
|
|
}
|
|
|
|
|
2001-11-07 02:17:22 +00:00
|
|
|
DPRINT("errCode %lx\n", errCode);
|
2000-07-01 17:07:02 +00:00
|
|
|
SetLastErrorByStatus (errCode);
|
1998-12-04 18:28:13 +00:00
|
|
|
|
2001-11-07 02:17:22 +00:00
|
|
|
return(WAIT_FAILED);
|
1999-01-04 23:01:18 +00:00
|
|
|
}
|
1999-09-12 20:54:42 +00:00
|
|
|
|
2001-01-20 12:20:43 +00:00
|
|
|
|
|
|
|
BOOL STDCALL
|
|
|
|
SignalObjectAndWait(HANDLE hObjectToSignal,
|
|
|
|
HANDLE hObjectToWaitOn,
|
|
|
|
DWORD dwMilliseconds,
|
|
|
|
BOOL bAlertable)
|
|
|
|
{
|
|
|
|
UNIMPLEMENTED
|
|
|
|
}
|
|
|
|
|
1999-09-12 20:54:42 +00:00
|
|
|
/* EOF */
|