GitHub Actions: Try MSVC builds with /std:c++17 and 20
[ACE_TAO.git] / ACE / ace / OS_NS_sys_wait.inl
blob1d687a8702dd0a22c07180a4e48357c038e36470
1 // -*- C++ -*-
2 #include "ace/OS_NS_errno.h"
3 #include "ace/Global_Macros.h"
5 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
7 ACE_INLINE pid_t
8 ACE_OS::wait (int *status)
10   ACE_OS_TRACE ("ACE_OS::wait");
11 #if defined (ACE_LACKS_WAIT)
12   ACE_UNUSED_ARG (status);
13   ACE_NOTSUP_RETURN (-1);
14 #else
15   ACE_OSCALL_RETURN (::wait (status), pid_t, -1);
16 #endif /* ACE_LACKS_WAIT */
19 ACE_INLINE pid_t
20 ACE_OS::waitpid (pid_t pid,
21                  ACE_exitcode *status,
22                  int wait_options,
23                  ACE_HANDLE handle)
25   ACE_OS_TRACE ("ACE_OS::waitpid");
26 #if defined (ACE_LACKS_WAITPID)
27   ACE_UNUSED_ARG (pid);
28   ACE_UNUSED_ARG (status);
29   ACE_UNUSED_ARG (wait_options);
30   ACE_UNUSED_ARG (handle);
32   ACE_NOTSUP_RETURN (-1);
33 #elif defined (ACE_WIN32)
34   int blocking_period = ACE_BIT_ENABLED (wait_options, WNOHANG)
35     ? 0 /* don't hang */
36     : INFINITE;
38   ACE_HANDLE phandle = handle;
40   if (phandle == 0)
41     {
42       phandle = ::OpenProcess (SYNCHRONIZE,
43                                FALSE,
44                                pid);
46       if (phandle == 0)
47         {
48           ACE_OS::set_errno_to_last_error ();
49           return -1;
50         }
51     }
53   pid_t result = pid;
55   // Don't try to get the process exit status if wait failed so we can
56   // keep the original error code intact.
57   switch (::WaitForSingleObject (phandle, blocking_period))
58     {
59     case WAIT_OBJECT_0:
60       if (status != 0)
61         // The error status of <GetExitCodeProcess> is nonetheless
62         // not tested because we don't know how to return the value.
63         ::GetExitCodeProcess (phandle, status);
64       break;
65     case WAIT_TIMEOUT:
66       errno = ETIME;
67       result = 0;
68       break;
69     default:
70       ACE_OS::set_errno_to_last_error ();
71       result = -1;
72     }
73   if (handle == 0)
74     ::CloseHandle (phandle);
75   return result;
76 #else
77   ACE_UNUSED_ARG (handle);
78   ACE_OSCALL_RETURN (::waitpid (pid, status, wait_options),
79                      pid_t, -1);
80 #endif /* ACE_LACKS_WAITPID */
83 ACE_INLINE pid_t
84 ACE_OS::wait (pid_t pid,
85               ACE_exitcode *status,
86               int wait_options,
87               ACE_HANDLE handle)
89   ACE_OS_TRACE ("ACE_OS::wait");
90   return ACE_OS::waitpid (pid,
91                           status,
92                           wait_options,
93                           handle);
96 ACE_END_VERSIONED_NAMESPACE_DECL