mirror of
https://github.com/qelectrotech/qelectrotech-source-mirror.git
synced 2026-06-13 16:23:14 +02:00
CLI: disable async crash-recovery backup in headless mode (fixes segfault)
QETProject schedules an asynchronous crash-recovery backup on construction (writeBackup() -> QtConcurrent::run(QET::writeToFile, ..., &m_backup_file)). In one-shot CLI mode the QETProject is destroyed as soon as the command returns, while that background write still references its m_backup_file member — an intermittent use-after-free segfault during teardown (~1 in 6 runs; observed on --resave and --set-titleblock). A crash-recovery backup is meaningless for a short-lived headless command, so add QETProject::setBackupEnabled(false), called from the CLI entry in main(). writeBackup() then early-returns, so no background write is ever launched. Fixes the crash for all CLI commands. See #492.
This commit is contained in:
@@ -19,6 +19,7 @@
|
|||||||
#include "machine_info.h"
|
#include "machine_info.h"
|
||||||
#include "qet.h"
|
#include "qet.h"
|
||||||
#include "qetapp.h"
|
#include "qetapp.h"
|
||||||
|
#include "qetproject.h"
|
||||||
#include "singleapplication.h"
|
#include "singleapplication.h"
|
||||||
#include "utils/macosxopenevent.h"
|
#include "utils/macosxopenevent.h"
|
||||||
#include "utils/qetsettings.h"
|
#include "utils/qetsettings.h"
|
||||||
@@ -206,6 +207,10 @@ QGuiApplication::setHighDpiScaleFactorRoundingPolicy(QetSettings::hdpiScaleFacto
|
|||||||
raw_args << QString::fromLocal8Bit(argv[i]);
|
raw_args << QString::fromLocal8Bit(argv[i]);
|
||||||
if (CLIExport::isExportRequest(raw_args)) {
|
if (CLIExport::isExportRequest(raw_args)) {
|
||||||
QApplication export_app(argc, argv);
|
QApplication export_app(argc, argv);
|
||||||
|
// No crash-recovery backups in one-shot CLI mode: the backup write
|
||||||
|
// runs on a background thread referencing the project and races the
|
||||||
|
// process exit (intermittent segfault in QET::writeToFile).
|
||||||
|
QETProject::setBackupEnabled(false);
|
||||||
return CLIExport::run(export_app.arguments());
|
return CLIExport::run(export_app.arguments());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,6 +43,13 @@
|
|||||||
|
|
||||||
static int BACKUP_INTERVAL = 1200000; //interval in ms of backup = 20min
|
static int BACKUP_INTERVAL = 1200000; //interval in ms of backup = 20min
|
||||||
|
|
||||||
|
bool QETProject::m_backup_enabled = true;
|
||||||
|
|
||||||
|
void QETProject::setBackupEnabled(bool enabled)
|
||||||
|
{
|
||||||
|
m_backup_enabled = enabled;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@brief QETProject::QETProject
|
@brief QETProject::QETProject
|
||||||
Create a empty project
|
Create a empty project
|
||||||
@@ -1783,6 +1790,8 @@ void QETProject::addDiagram(Diagram *diagram, int pos)
|
|||||||
*/
|
*/
|
||||||
void QETProject::writeBackup()
|
void QETProject::writeBackup()
|
||||||
{
|
{
|
||||||
|
if (!m_backup_enabled)
|
||||||
|
return;
|
||||||
#ifdef BUILD_WITHOUT_KF5
|
#ifdef BUILD_WITHOUT_KF5
|
||||||
#else
|
#else
|
||||||
# if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) // ### Qt 6: remove
|
# if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) // ### Qt 6: remove
|
||||||
|
|||||||
@@ -105,6 +105,12 @@ class QETProject : public QObject
|
|||||||
QVersionNumber declaredQElectroTechVersion();
|
QVersionNumber declaredQElectroTechVersion();
|
||||||
void setTitle(const QString &);
|
void setTitle(const QString &);
|
||||||
|
|
||||||
|
/// Enable/disable the asynchronous crash-recovery backup for all
|
||||||
|
/// projects. Disabled by the headless CLI: the backup write runs on a
|
||||||
|
/// background thread referencing the project, and a short-lived CLI
|
||||||
|
/// process can destroy the project before the write finishes (crash).
|
||||||
|
static void setBackupEnabled(bool enabled);
|
||||||
|
|
||||||
///DEFAULT PROPERTIES
|
///DEFAULT PROPERTIES
|
||||||
BorderProperties defaultBorderProperties() const;
|
BorderProperties defaultBorderProperties() const;
|
||||||
void setDefaultBorderProperties(const BorderProperties &);
|
void setDefaultBorderProperties(const BorderProperties &);
|
||||||
@@ -241,6 +247,8 @@ class QETProject : public QObject
|
|||||||
|
|
||||||
// attributes
|
// attributes
|
||||||
private:
|
private:
|
||||||
|
/// When false, writeBackup() is a no-op (set by the headless CLI)
|
||||||
|
static bool m_backup_enabled;
|
||||||
/// File path this project is saved to
|
/// File path this project is saved to
|
||||||
QString m_file_path;
|
QString m_file_path;
|
||||||
/// Current state of the project
|
/// Current state of the project
|
||||||
|
|||||||
Reference in New Issue
Block a user