summaryrefslogtreecommitdiff
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
parenta4a0e59d8ce7d3f9fbe0806a5621c27932f26314 (diff)
windows 7 doesn't play well with job objects, so just wait on individual handles
fixed getProcessTreeFromProcess() not behaving like getProcessTreeFromJob()
-rw-r--r--src/envmodule.cpp13
-rw-r--r--src/processrunner.cpp22
2 files changed, 25 insertions, 10 deletions
diff --git a/src/envmodule.cpp b/src/envmodule.cpp
index 8d348b5e..5be52de6 100644
--- a/src/envmodule.cpp
+++ b/src/envmodule.cpp
@@ -545,23 +545,20 @@ void findChildren(Process& parent, const std::vector<Process>& processes)
Process getProcessTreeFromProcess(HANDLE h)
{
+ Process root;
+
const auto parentPID = ::GetProcessId(h);
const auto v = getRunningProcesses();
- Process root;
for (auto&& p : v) {
if (p.pid() == parentPID) {
- root = p;
+ Process child = p;
+ findChildren(child, v);
+ root.addChild(child);
break;
}
}
- if (root.pid() == 0) {
- return {};
- }
-
- findChildren(root, v);
-
return root;
}
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, [&]{