:pserver:cvsanon@mok.lvcm.com:/CVS/ReactOS reactos
[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 <ddk/ntddk.h>
15 #include <kernel32/error.h>
16 #include <windows.h>
17 #include <wchar.h>
18
19 #define NDEBUG
20 #include <kernel32/kernel32.h>
21
22 /* FUNCTIONS ****************************************************************/
23
24 DWORD STDCALL
25 WaitForSingleObject(HANDLE hHandle,
26                     DWORD dwMilliseconds)
27 {
28    return WaitForSingleObjectEx(hHandle,
29                                 dwMilliseconds,
30                                 FALSE);
31 }
32
33
34 DWORD STDCALL
35 WaitForSingleObjectEx(HANDLE hHandle,
36                       DWORD  dwMilliseconds,
37                       BOOL   bAlertable)
38 {
39    NTSTATUS  errCode;
40    PLARGE_INTEGER TimePtr;
41    LARGE_INTEGER Time;
42
43    if (dwMilliseconds == INFINITE)
44      {
45         TimePtr = NULL;
46      }
47    else
48      {
49         Time.QuadPart = -10000 * dwMilliseconds;
50         TimePtr = &Time;
51      }
52
53    errCode = NtWaitForSingleObject(hHandle,
54                                    (BOOLEAN) bAlertable,
55                                    TimePtr);
56    if (errCode == STATUS_TIMEOUT)
57      {
58          return WAIT_TIMEOUT;
59      }
60    else if ((errCode == WAIT_OBJECT_0) ||
61             (errCode == WAIT_ABANDONED_0))
62      {
63         return(errCode);
64      }
65
66    SetLastErrorByStatus (errCode);
67
68    return(WAIT_FAILED);
69 }
70
71
72 DWORD STDCALL
73 WaitForMultipleObjects(DWORD nCount,
74                        CONST HANDLE *lpHandles,
75                        BOOL  bWaitAll,
76                        DWORD dwMilliseconds)
77 {
78    return WaitForMultipleObjectsEx(nCount,
79                                    lpHandles,
80                                    bWaitAll ? WaitAll : WaitAny,
81                                    dwMilliseconds,
82                                    FALSE);
83 }
84
85
86 DWORD STDCALL
87 WaitForMultipleObjectsEx(DWORD nCount,
88                          CONST HANDLE *lpHandles,
89                          BOOL  bWaitAll,
90                          DWORD dwMilliseconds,
91                          BOOL  bAlertable)
92 {
93    NTSTATUS  errCode;
94    LARGE_INTEGER Time;
95    PLARGE_INTEGER TimePtr;
96
97    DPRINT("nCount %lu\n", nCount);
98
99    if (dwMilliseconds == INFINITE)
100      {
101         TimePtr = NULL;
102      }
103    else
104      {
105         Time.QuadPart = -10000 * dwMilliseconds;
106         TimePtr = &Time;
107      }
108
109    errCode = NtWaitForMultipleObjects (nCount,
110                                        (PHANDLE)lpHandles,
111                                        (CINT)bWaitAll,
112                                        (BOOLEAN)bAlertable,
113                                        TimePtr);
114
115    if (errCode == STATUS_TIMEOUT)
116      {
117          return WAIT_TIMEOUT;
118      }
119    else if (((errCode >= WAIT_OBJECT_0) &&
120              (errCode <= WAIT_OBJECT_0 + nCount - 1)) ||
121             ((errCode >= WAIT_ABANDONED_0) &&
122              (errCode <= WAIT_ABANDONED_0 + nCount - 1)))
123      {
124         return(errCode);
125      }
126
127    DPRINT("errCode %lx\n", errCode);
128    SetLastErrorByStatus (errCode);
129
130    return(WAIT_FAILED);
131 }
132
133
134 BOOL STDCALL
135 SignalObjectAndWait(HANDLE hObjectToSignal,
136                     HANDLE hObjectToWaitOn,
137                     DWORD dwMilliseconds,
138                     BOOL bAlertable)
139 {
140    UNIMPLEMENTED
141 }
142
143 /* EOF */