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