diff options
Diffstat (limited to 'boost/process/detail/windows/group_ref.hpp')
-rw-r--r-- | boost/process/detail/windows/group_ref.hpp | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/boost/process/detail/windows/group_ref.hpp b/boost/process/detail/windows/group_ref.hpp new file mode 100644 index 0000000000..1f62c4dcb0 --- /dev/null +++ b/boost/process/detail/windows/group_ref.hpp @@ -0,0 +1,51 @@ +// Copyright (c) 2016 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_DETAIL_WINDOWS_GROUP_REF_HPP_ +#define BOOST_PROCESS_DETAIL_WINDOWS_GROUP_REF_HPP_ + +#include <boost/process/detail/config.hpp> +#include <boost/process/detail/windows/group_handle.hpp> +#include <boost/detail/winapi/process.hpp> +#include <boost/process/detail/windows/handler.hpp> + +namespace boost { namespace process { + +namespace detail { namespace windows { + + + +struct group_ref : handler_base_ext +{ + ::boost::detail::winapi::HANDLE_ handle; + + explicit group_ref(group_handle &g) : + handle(g.handle()) + {} + + template <class Executor> + void on_setup(Executor& exec) const + { + //I can only enable this if the current process supports breakaways. + if (in_group() && break_away_enabled(nullptr)) + exec.creation_flags |= boost::detail::winapi::CREATE_BREAKAWAY_FROM_JOB_; + } + + + template <class Executor> + void on_success(Executor& exec) const + { + if (!::boost::detail::winapi::AssignProcessToJobObject(handle, exec.proc_info.hProcess)) + exec.set_error(::boost::process::detail::get_last_error(), + "AssignProcessToJobObject() failed."); + + } + +}; + +}}}} + + +#endif /* BOOST_PROCESS_DETAIL_WINDOWS_GROUP_HPP_ */ |