forked from OctaForge/libostd
simplify windows process code
This commit is contained in:
parent
884e8c2849
commit
5bbee30f6c
|
@ -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 */
|
||||||
|
|
Loading…
Reference in a new issue