diff --git a/app/main.cpp b/app/main.cpp index 64ddc89b8..e1d30edfe 100644 --- a/app/main.cpp +++ b/app/main.cpp @@ -152,6 +152,11 @@ int main(int argc, char *argv[]) // Set up debug handler qInstallMessageHandler(olive::DebugHandler); + // Ignore SIGPIPE so that writing to a render-worker process that has + // already crashed/closed does not terminate the main application. QProcess + // will report the failure through its normal error path instead. + signal(SIGPIPE, SIG_IGN); + // Set application metadata QCoreApplication::setOrganizationName("oakvideoeditor.org"); QCoreApplication::setOrganizationDomain("oakvideoeditor.org"); diff --git a/app/render/renderworkerpool.cpp b/app/render/renderworkerpool.cpp index 5e8ba6ab2..79331f50b 100644 --- a/app/render/renderworkerpool.cpp +++ b/app/render/renderworkerpool.cpp @@ -267,12 +267,24 @@ QString WorkerProgramPath() bool WriteControlMessage(QProcess *process, const QJsonObject &obj) { + if (!process || process->state() != QProcess::Running) { + return false; + } + const QByteArray line = QJsonDocument(obj).toJson(QJsonDocument::Compact) + '\n'; - return process->write(line) == line.size() && process->waitForBytesWritten(5000); + const qint64 written = process->write(line); + if (written != line.size()) { + return false; + } + return process->waitForBytesWritten(5000); } void TryWriteControlMessage(QProcess *process, const QJsonObject &obj) { + if (!process || process->state() != QProcess::Running) { + return; + } + const QByteArray line = QJsonDocument(obj).toJson(QJsonDocument::Compact) + '\n'; process->write(line); }