diff options
Diffstat (limited to 'boost/process/detail/windows/is_running.hpp')
-rw-r--r-- | boost/process/detail/windows/is_running.hpp | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/boost/process/detail/windows/is_running.hpp b/boost/process/detail/windows/is_running.hpp new file mode 100644 index 0000000000..66cc6837ae --- /dev/null +++ b/boost/process/detail/windows/is_running.hpp @@ -0,0 +1,64 @@ +// Copyright (c) 2106 Klemens D. Morgenstern +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_PROCESS_WINDOWS_IS_RUNNING_HPP +#define BOOST_PROCESS_WINDOWS_IS_RUNNING_HPP + +#include <boost/process/detail/config.hpp> +#include <system_error> +#include <cstdlib> +#include <boost/detail/winapi/process.hpp> + +namespace boost { namespace process { namespace detail { namespace windows { + +constexpr static ::boost::detail::winapi::DWORD_ still_active = 259; + + +struct child_handle; + +inline bool is_running(const child_handle &p, int & exit_code) +{ + ::boost::detail::winapi::DWORD_ code; + //single value, not needed in the winapi. + if (!::boost::detail::winapi::GetExitCodeProcess(p.process_handle(), &code)) + ::boost::process::detail::throw_last_error("GetExitCodeProcess() failed"); + + if (code == still_active) + return true; + else + { + exit_code = code; + return false; + } +} + +inline bool is_running(const child_handle &p, int & exit_code, std::error_code &ec) noexcept +{ + ::boost::detail::winapi::DWORD_ code; + //single value, not needed in the winapi. + if (!::boost::detail::winapi::GetExitCodeProcess(p.process_handle(), &code)) + ec = ::boost::process::detail::get_last_error(); + else + ec.clear(); + + if (code == still_active) + return true; + else + { + exit_code = code; + return false; + } +} + +inline bool is_running(int code) +{ + return code == still_active; +} + +inline int eval_exit_status(int in ) {return in;} + +}}}} + +#endif |