simplify windows process code

This commit is contained in:
q66 2017-05-12 23:47:25 +02:00
parent 884e8c2849
commit 5bbee30f6c

View file

@ -85,10 +85,6 @@ OSTD_EXPORT void split_args_impl(
} /* namespace detail */ } /* namespace detail */
struct data {
HANDLE process = nullptr, thread = nullptr;
};
struct pipe { struct pipe {
HANDLE p_r = nullptr, p_w = nullptr; HANDLE p_r = nullptr, p_w = nullptr;
@ -385,13 +381,12 @@ OSTD_EXPORT void subprocess::open_impl(
&pi &pi
); );
p_current = ::new (reinterpret_cast<void *>(&p_data)) data{
pi.hProcess, pi.hThread
};
if (!success) { if (!success) {
throw subprocess_error{"could not execute subprocess"}; throw subprocess_error{"could not execute subprocess"};
} }
CloseHandle(pi.hThread);
p_current = static_cast<void *>(pi.hProcess);
} }
OSTD_EXPORT void subprocess::reset() { OSTD_EXPORT void subprocess::reset() {
@ -403,49 +398,33 @@ OSTD_EXPORT int subprocess::close() {
throw subprocess_error{"no child process"}; throw subprocess_error{"no child process"};
} }
data *pd = static_cast<data *>(p_current); HANDLE *proc = static_cast<HANDLE *>(p_current);
if (WaitForSingleObject(pd->process, INFINITE) == WAIT_FAILED) { if (WaitForSingleObject(proc, INFINITE) == WAIT_FAILED) {
CloseHandle(pd->process); CloseHandle(proc);
CloseHandle(pd->thread);
reset(); reset();
throw subprocess_error{"child process wait failed"}; throw subprocess_error{"child process wait failed"};
} }
DWORD ec = 0; DWORD ec = 0;
if (!GetExitCodeProcess(pd->process, &ec)) { if (!GetExitCodeProcess(proc, &ec)) {
CloseHandle(pd->process); CloseHandle(proc);
CloseHandle(pd->thread);
reset(); reset();
throw subprocess_error{"could not retrieve exit code"}; throw subprocess_error{"could not retrieve exit code"};
} }
CloseHandle(pd->process); CloseHandle(proc);
CloseHandle(pd->thread);
reset(); reset();
return int(ec); return int(ec);
} }
OSTD_EXPORT void subprocess::move_data(subprocess &i) { OSTD_EXPORT void subprocess::move_data(subprocess &i) {
data *od = static_cast<data *>(i.p_current); std::swap(p_current, i.p_current);
if (!od) {
return;
}
p_current = ::new (reinterpret_cast<void *>(&p_data)) data{*od};
i.p_current = nullptr;
} }
OSTD_EXPORT void subprocess::swap_data(subprocess &i) { OSTD_EXPORT void subprocess::swap_data(subprocess &i) {
if (!p_current) { move_data(i);
move_data(i);
} else if (!i.p_current) {
i.move_data(*this);
} else {
std::swap(
*static_cast<data *>(p_current), *static_cast<data *>(i.p_current)
);
}
} }
} /* namespace ostd */ } /* namespace ostd */