diff options
| author | isanae <14251494+isanae@users.noreply.github.com> | 2019-12-18 17:21:52 -0500 |
|---|---|---|
| committer | isanae <14251494+isanae@users.noreply.github.com> | 2019-12-18 17:21:52 -0500 |
| commit | 31cd5531d030838a30d55bcd63cadfff4ecd50ca (patch) | |
| tree | 2f3cb66505c85290a5fc2817be13b6f1cec1e6f8 /src | |
| parent | a4a0e59d8ce7d3f9fbe0806a5621c27932f26314 (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')
| -rw-r--r-- | src/envmodule.cpp | 13 | ||||
| -rw-r--r-- | src/processrunner.cpp | 22 |
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, [&]{ |
