From 5bbee30f6cf63a8e57f8d00fba45655f3c865abb Mon Sep 17 00:00:00 2001 From: q66 Date: Fri, 12 May 2017 23:47:25 +0200 Subject: [PATCH] simplify windows process code --- src/win32/process.cc | 43 +++++++++++-------------------------------- 1 file changed, 11 insertions(+), 32 deletions(-) diff --git a/src/win32/process.cc b/src/win32/process.cc index 38aac0c..af37eff 100644 --- a/src/win32/process.cc +++ b/src/win32/process.cc @@ -85,10 +85,6 @@ OSTD_EXPORT void split_args_impl( } /* namespace detail */ -struct data { - HANDLE process = nullptr, thread = nullptr; -}; - struct pipe { HANDLE p_r = nullptr, p_w = nullptr; @@ -385,13 +381,12 @@ OSTD_EXPORT void subprocess::open_impl( &pi ); - p_current = ::new (reinterpret_cast(&p_data)) data{ - pi.hProcess, pi.hThread - }; - if (!success) { throw subprocess_error{"could not execute subprocess"}; } + + CloseHandle(pi.hThread); + p_current = static_cast(pi.hProcess); } OSTD_EXPORT void subprocess::reset() { @@ -403,49 +398,33 @@ OSTD_EXPORT int subprocess::close() { throw subprocess_error{"no child process"}; } - data *pd = static_cast(p_current); + HANDLE *proc = static_cast(p_current); - if (WaitForSingleObject(pd->process, INFINITE) == WAIT_FAILED) { - CloseHandle(pd->process); - CloseHandle(pd->thread); + if (WaitForSingleObject(proc, INFINITE) == WAIT_FAILED) { + CloseHandle(proc); reset(); throw subprocess_error{"child process wait failed"}; } DWORD ec = 0; - if (!GetExitCodeProcess(pd->process, &ec)) { - CloseHandle(pd->process); - CloseHandle(pd->thread); + if (!GetExitCodeProcess(proc, &ec)) { + CloseHandle(proc); reset(); throw subprocess_error{"could not retrieve exit code"}; } - CloseHandle(pd->process); - CloseHandle(pd->thread); + CloseHandle(proc); reset(); return int(ec); } OSTD_EXPORT void subprocess::move_data(subprocess &i) { - data *od = static_cast(i.p_current); - if (!od) { - return; - } - p_current = ::new (reinterpret_cast(&p_data)) data{*od}; - i.p_current = nullptr; + std::swap(p_current, i.p_current); } OSTD_EXPORT void subprocess::swap_data(subprocess &i) { - if (!p_current) { - move_data(i); - } else if (!i.p_current) { - i.move_data(*this); - } else { - std::swap( - *static_cast(p_current), *static_cast(i.p_current) - ); - } + move_data(i); } } /* namespace ostd */