branch update for HEAD-2003021201
[reactos.git] / lib / kernel32 / synch / wait.c
1 /* $Id$
2  *
3  * COPYRIGHT:       See COPYING in the top level directory
4  * PROJECT:         ReactOS system libraries
5  * FILE:            lib/kernel32/synch/wait.c
6  * PURPOSE:         Wait functions
7  * PROGRAMMER:      Ariadne ( ariadne@xs4all.nl)
8  * UPDATE HISTORY:
9  *                  Created 01/11/98
10  */
11
12 /* INCLUDES *****************************************************************/
13
14 #include <k32.h>
15
16 #define NDEBUG
17 #include <kernel32/kernel32.h>
18
19 /* FUNCTIONS ****************************************************************/
20
21 DWORD STDCALL
22 WaitForSingleObject(HANDLE hHandle,
23                     DWORD dwMilliseconds)
24 {
25    return WaitForSingleObjectEx(hHandle,
26                                 dwMilliseconds,
27                                 FALSE);
28 }
29
30
31 DWORD STDCALL
32 WaitForSingleObjectEx(HANDLE hHandle,
33                       DWORD  dwMilliseconds,
34                       BOOL   bAlertable)
35 {
36    NTSTATUS  errCode;
37    PLARGE_INTEGER TimePtr;
38    LARGE_INTEGER Time;
39
40    if (dwMilliseconds == INFINITE)
41      {
42         TimePtr = NULL;
43      }
44    else
45      {
46         Time.QuadPart = -10000 * dwMilliseconds;
47         TimePtr = &Time;
48      }
49
50    errCode = NtWaitForSingleObject(hHandle,
51                                    (BOOLEAN) bAlertable,
52                                    TimePtr);
53    if (errCode == STATUS_TIMEOUT)
54      {
55          return WAIT_TIMEOUT;
56      }
57    else if ((errCode == WAIT_OBJECT_0) ||
58             (errCode == WAIT_ABANDONED_0))
59      {
60         return(errCode);
61      }
62
63    SetLastErrorByStatus (errCode);
64
65    return(WAIT_FAILED);
66 }
67
68
69 DWORD STDCALL
70 WaitForMultipleObjects(DWORD nCount,
71                        CONST HANDLE *lpHandles,
72                        BOOL  bWaitAll,
73                        DWORD dwMilliseconds)
74 {
75    return WaitForMultipleObjectsEx(nCount,
76                                    lpHandles,
77                                    bWaitAll ? WaitAll : WaitAny,
78                                    dwMilliseconds,
79                                    FALSE);
80 }
81
82
83 DWORD STDCALL
84 WaitForMultipleObjectsEx(DWORD nCount,
85                          CONST HANDLE *lpHandles,
86                          BOOL  bWaitAll,
87                          DWORD dwMilliseconds,
88                          BOOL  bAlertable)
89 {
90    NTSTATUS  errCode;
91    LARGE_INTEGER Time;
92    PLARGE_INTEGER TimePtr;
93
94    DPRINT("nCount %lu\n", nCount);
95
96    if (dwMilliseconds == INFINITE)
97      {
98         TimePtr = NULL;
99      }
100    else
101      {
102         Time.QuadPart = -10000 * dwMilliseconds;
103         TimePtr = &Time;
104      }
105
106    errCode = NtWaitForMultipleObjects (nCount,
107                                        (PHANDLE)lpHandles,
108                                        (CINT)bWaitAll,
109                                        (BOOLEAN)bAlertable,
110                                        TimePtr);
111
112    if (errCode == STATUS_TIMEOUT)
113      {
114          return WAIT_TIMEOUT;
115      }
116    else if (((errCode >= WAIT_OBJECT_0) &&
117              (errCode <= WAIT_OBJECT_0 + nCount - 1)) ||
118             ((errCode >= WAIT_ABANDONED_0) &&
119              (errCode <= WAIT_ABANDONED_0 + nCount - 1)))
120      {
121         return(errCode);
122      }
123
124    DPRINT("errCode %lx\n", errCode);
125    SetLastErrorByStatus (errCode);
126
127    return(WAIT_FAILED);
128 }
129
130
131 BOOL STDCALL
132 SignalObjectAndWait(HANDLE hObjectToSignal,
133                     HANDLE hObjectToWaitOn,
134                     DWORD dwMilliseconds,
135                     BOOL bAlertable)
136 {
137    UNIMPLEMENTED
138 }
139
140 /* EOF */