summaryrefslogtreecommitdiff
path: root/src/processrunner.cpp
diff options
context:
space:
mode:
authorisanae <14251494+isanae@users.noreply.github.com>2019-12-18 17:21:52 -0500
committerisanae <14251494+isanae@users.noreply.github.com>2019-12-18 17:21:52 -0500
commit31cd5531d030838a30d55bcd63cadfff4ecd50ca (patch)
tree2f3cb66505c85290a5fc2817be13b6f1cec1e6f8 /src/processrunner.cpp
parenta4a0e59d8ce7d3f9fbe0806a5621c27932f26314 (diff)
windows 7 doesn't play well with job objects, so just wait on individual handles
fixed getProcessTreeFromProcess() not behaving like getProcessTreeFromJob()
Diffstat (limited to 'src/processrunner.cpp')
-rw-r--r--src/processrunner.cpp22
1 files changed, 20 insertions, 2 deletions
diff --git a/src/processrunner.cpp b/src/processrunner.cpp
index 945d61c3..3f1e3a3b 100644
--- a/src/processrunner.cpp
+++ b/src/processrunner.cpp
@@ -360,6 +360,11 @@ void waitForProcessesThread(
ProcessRunner::Results waitForProcesses(
const std::vector<HANDLE>& initialProcesses, UILocker::Session& ls)
{
+ if (initialProcesses.empty()) {
+ // nothing to wait for
+ return ProcessRunner::Completed;
+ }
+
// using a job so any child process started by any of those processes can also
// be captured and monitored
env::HandlePtr job(CreateJobObjectW(nullptr, nullptr));
@@ -373,8 +378,12 @@ ProcessRunner::Results waitForProcesses(
return ProcessRunner::Error;
}
+ bool oneWorked = false;
+
for (auto&& h : initialProcesses) {
- if (!::AssignProcessToJobObject(job.get(), h)) {
+ if (::AssignProcessToJobObject(job.get(), h)) {
+ oneWorked = true;
+ } else {
const auto e = GetLastError();
// this happens when closing MO while multiple processes are running,
@@ -388,12 +397,21 @@ ProcessRunner::Results waitForProcesses(
}
}
+ HANDLE monitor = INVALID_HANDLE_VALUE;
+
+ if (oneWorked) {
+ monitor = job.get();
+ } else {
+ // none of the handles could be added to the job, just monitor the first one
+ monitor = initialProcesses[0];
+ }
+
auto results = ProcessRunner::Running;
std::atomic<bool> interrupt(false);
auto* t = QThread::create(
waitForProcessesThread,
- std::ref(results), job.get(), std::ref(ls), std::ref(interrupt));
+ std::ref(results), monitor, std::ref(ls), std::ref(interrupt));
QEventLoop events;
QObject::connect(t, &QThread::finished, [&]{