| 64 | } |
| 65 | |
| 66 | std::variant<int, ProcessConfig::ProcStartError> |
| 67 | ProcessConfig::StartProcessAndWait(int timeout) |
| 68 | { |
| 69 | ResetFinishedProcessData(); |
| 70 | |
| 71 | QProcess process; |
| 72 | process.setWorkingDirectory(QString::fromStdString(WorkingDir())); |
| 73 | process.start(QString::fromStdString(Path()), Args()); |
| 74 | SetProcessId(QString::number(process.processId()).toStdString()); |
| 75 | vblog(LOG_INFO, "run \"%s\" with a timeout of %d ms", Path().c_str(), |
| 76 | timeout); |
| 77 | |
| 78 | if (!process.waitForFinished(timeout)) { |
| 79 | if (process.error() == QProcess::FailedToStart) { |
| 80 | vblog(LOG_INFO, "failed to start \"%s\"!", |
| 81 | Path().c_str()); |
| 82 | return ProcStartError::FAILED_TO_START; |
| 83 | } |
| 84 | |
| 85 | SetFinishedProcessData(process); |
| 86 | vblog(LOG_INFO, |
| 87 | "timeout while running \"%s\"\nAttempting to kill process!", |
| 88 | Path().c_str()); |
| 89 | process.kill(); |
| 90 | process.waitForFinished(); |
| 91 | |
| 92 | return ProcStartError::TIMEOUT; |
| 93 | } |
| 94 | |
| 95 | SetFinishedProcessData(process); |
| 96 | |
| 97 | if (process.exitStatus() == QProcess::NormalExit) { |
| 98 | return process.exitCode(); |
| 99 | } |
| 100 | |
| 101 | vblog(LOG_INFO, "process \"%s\" crashed!", Path().c_str()); |
| 102 | return ProcStartError::CRASH; |
| 103 | } |
| 104 | |
| 105 | void ProcessConfig::SetFinishedProcessData(QProcess &process) |
| 106 | { |
no test coverage detected