summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorisanae <14251494+isanae@users.noreply.github.com>2019-10-31 03:54:18 -0400
committerisanae <14251494+isanae@users.noreply.github.com>2019-11-06 07:44:59 -0500
commitd72e94a92f31bcc720d12ed0cb2cc75b590e6770 (patch)
treedb195349495d6f6baa34273f0c38d8845cec49ec
parenta88f9dd9a703c23263b5561d3cae126e90e36f3f (diff)
added attachToProcess(), made waitForApplication() private
changed OrganizerProxy::startApplication() so it _doesn't_ wait for completion, which is its original behaviour
-rw-r--r--src/organizerproxy.cpp13
-rw-r--r--src/processrunner.cpp37
-rw-r--r--src/processrunner.h19
3 files changed, 43 insertions, 26 deletions
diff --git a/src/organizerproxy.cpp b/src/organizerproxy.cpp
index 9de5b4ba..0b6f8df1 100644
--- a/src/organizerproxy.cpp
+++ b/src/organizerproxy.cpp
@@ -123,9 +123,9 @@ HANDLE OrganizerProxy::startApplication(
auto runner = m_Proxied->processRunner();
+ // don't wait for completion
runner
.setFromFileOrExecutable(exe, args, cwd, profile, overwrite, ignoreOverwrite)
- .setWaitForCompletion(ProcessRunner::Refresh)
.run();
return runner.processHandle();
@@ -139,8 +139,15 @@ bool OrganizerProxy::waitForApplication(HANDLE handle, LPDWORD exitCode) const
"a plugin wants to wait for an application to complete, pid {}{}",
pid, (pid == 0 ? "unknown (probably already completed)" : ""));
- const auto r = m_Proxied->processRunner().waitForApplication(
- handle, exitCode, LockWidget::OutputRequired);
+ auto runner = m_Proxied->processRunner();
+
+ const auto r = runner
+ .setWaitForCompletion(ProcessRunner::NoRefresh, LockWidget::OutputRequired)
+ .attachToProcess(handle);
+
+ if (exitCode) {
+ *exitCode = runner.exitCode();
+ }
switch (r)
{
diff --git a/src/processrunner.cpp b/src/processrunner.cpp
index e6f916c5..b732204c 100644
--- a/src/processrunner.cpp
+++ b/src/processrunner.cpp
@@ -593,9 +593,15 @@ ProcessRunner::Results ProcessRunner::run()
return Error;
}
- // not all files will return a valid handle even if opening them was
- // successful, such as inproc handlers (like the photo viewer)
m_handle = r.stealProcessHandle();
+
+ // not all files will return a valid handle even if opening them was
+ // successful, such as inproc handlers (like the photo viewer); in this
+ // case it's impossible to determine the status, so just say it's still
+ // running
+ if (m_handle == INVALID_HANDLE_VALUE) {
+ return Running;
+ }
} else {
if (m_profileName.isEmpty()) {
const auto* profile = m_core.currentProfile();
@@ -642,18 +648,29 @@ ProcessRunner::Results ProcessRunner::run()
}
}
- if (m_handle == INVALID_HANDLE_VALUE || m_lock == LockWidget::NoReason) {
+ return postRun();
+}
+
+ProcessRunner::Results ProcessRunner::postRun()
+{
+ if (m_lock == LockWidget::NoReason) {
return Running;
- } else {
- const auto r = waitForProcessCompletionWithLock(
- m_handle, &m_exitCode, m_lock);
+ }
- if (r == Completed && m_refresh == Refresh) {
- m_core.afterRun(m_sp.binary, m_exitCode);
- }
+ const auto r = waitForProcessCompletionWithLock(
+ m_handle, &m_exitCode, m_lock);
- return r;
+ if (r == Completed && m_refresh == Refresh) {
+ m_core.afterRun(m_sp.binary, m_exitCode);
}
+
+ return r;
+}
+
+ProcessRunner::Results ProcessRunner::attachToProcess(HANDLE h)
+{
+ m_handle = h;
+ return postRun();
}
DWORD ProcessRunner::exitCode()
diff --git a/src/processrunner.h b/src/processrunner.h
index bdd0b260..62ec7a9e 100644
--- a/src/processrunner.h
+++ b/src/processrunner.h
@@ -77,12 +77,11 @@ public:
bool ignoreCustomOverwrite=false);
Results run();
+ Results attachToProcess(HANDLE h);
+
DWORD exitCode();
HANDLE processHandle();
- Results waitForApplication(
- HANDLE processHandle, LPDWORD exitCode, LockWidget::Reasons reason);
-
Results waitForAllUSVFSProcessesWithLock(LockWidget::Reasons reason);
private:
@@ -98,16 +97,7 @@ private:
HANDLE m_handle;
DWORD m_exitCode;
- HANDLE spawnAndWait(
- const QFileInfo &binary, const QString &arguments,
- const QString &profileName,
- const QDir &currentDirectory,
- const QString &steamAppID,
- const QString &customOverwrite,
- const QList<MOBase::ExecutableForcedLoadSetting> &forcedLibraries={},
- LPDWORD exitCode = nullptr);
-
- SpawnedProcess spawn(spawn::SpawnParameters sp);
+ Results postRun();
void withLock(
LockWidget::Reasons reason, std::function<void (LockWidget&)> f);
@@ -115,6 +105,9 @@ private:
Results waitForProcessCompletionWithLock(
HANDLE handle, LPDWORD exitCode, LockWidget::Reasons reason);
+ Results waitForApplication(
+ HANDLE processHandle, LPDWORD exitCode, LockWidget::Reasons reason);
+
Results waitForAllUSVFSProcesses(LockWidget& lock);
};