mirror of
https://bitbucket.org/librepilot/librepilot.git
synced 2025-02-26 15:54:15 +01:00
LP-491 fix a gcs crash at exit when using -log option
This commit is contained in:
parent
29005473d4
commit
07b30ba290
@ -286,7 +286,7 @@ void systemInit()
|
||||
QSurfaceFormat::setDefaultFormat(format);
|
||||
}
|
||||
|
||||
static FileLogger *logger;
|
||||
static FileLogger *logger = NULL;
|
||||
|
||||
void mainMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
|
||||
{
|
||||
@ -295,14 +295,27 @@ void mainMessageOutput(QtMsgType type, const QMessageLogContext &context, const
|
||||
|
||||
Q_DECLARE_METATYPE(QtMsgType)
|
||||
|
||||
void logInit(QString fileName)
|
||||
void logInit(QString &fileName)
|
||||
{
|
||||
qRegisterMetaType<QtMsgType>();
|
||||
qInstallMessageHandler(mainMessageOutput);
|
||||
logger = new FileLogger();
|
||||
if (!logger->start(fileName)) {
|
||||
logger = new FileLogger(fileName);
|
||||
if (!logger->start()) {
|
||||
delete logger;
|
||||
logger = NULL;
|
||||
displayError(msgLogfileOpenFailed(fileName));
|
||||
return;
|
||||
}
|
||||
qInstallMessageHandler(mainMessageOutput);
|
||||
}
|
||||
|
||||
void logDeinit()
|
||||
{
|
||||
if (!logger) {
|
||||
return;
|
||||
}
|
||||
qInstallMessageHandler(0);
|
||||
delete logger;
|
||||
logger = NULL;
|
||||
}
|
||||
|
||||
AppOptions options()
|
||||
@ -618,9 +631,7 @@ int main(int argc, char * *argv)
|
||||
|
||||
qDebug() << "main - GCS ran for" << timer.elapsed() << "ms";
|
||||
|
||||
if (logger) {
|
||||
delete logger;
|
||||
}
|
||||
logDeinit();
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -39,40 +39,34 @@
|
||||
class QTCREATOR_UTILS_EXPORT FileLogger : public QObject {
|
||||
Q_OBJECT
|
||||
|
||||
private:
|
||||
QTextStream * logStream;
|
||||
QThread *loggerThread;
|
||||
bool started;
|
||||
|
||||
public:
|
||||
FileLogger() : QObject(), logStream(NULL), loggerThread(NULL), started(false)
|
||||
FileLogger(QString &fileName) : QObject(), file(fileName), logStream(NULL), loggerThread(NULL), started(false)
|
||||
{}
|
||||
|
||||
virtual ~FileLogger()
|
||||
{
|
||||
qDebug() << "~FileLogger";
|
||||
stop();
|
||||
if (logStream) {
|
||||
delete logStream;
|
||||
}
|
||||
delete logStream;
|
||||
logStream = NULL;
|
||||
}
|
||||
|
||||
public:
|
||||
bool start(const QString &fileName)
|
||||
bool start()
|
||||
{
|
||||
if (started) {
|
||||
return false;
|
||||
}
|
||||
|
||||
QFile *file = new QFile(fileName);
|
||||
if (!file->open(QIODevice::WriteOnly | QIODevice::Text)) {
|
||||
if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
logStream = new QTextStream(file);
|
||||
logStream = new QTextStream(&file);
|
||||
|
||||
loggerThread = new QThread(this);
|
||||
moveToThread(loggerThread);
|
||||
loggerThread->start();
|
||||
// loggerThread = new QThread(this);
|
||||
moveToThread(&loggerThread);
|
||||
// connect(&loggerThread, &QThread::finished, this, &QObject::deleteLater);
|
||||
loggerThread.start();
|
||||
|
||||
started = true;
|
||||
|
||||
@ -93,6 +87,9 @@ public:
|
||||
QMetaObject::invokeMethod(this, "doLog", Qt::BlockingQueuedConnection,
|
||||
Q_ARG(QtMsgType, type), Q_ARG(const QString &, msg));
|
||||
|
||||
loggerThread.quit();
|
||||
loggerThread.wait();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -138,4 +135,10 @@ private slots:
|
||||
out << msg << '\n';
|
||||
out.flush();
|
||||
}
|
||||
|
||||
private:
|
||||
QFile file;
|
||||
QTextStream *logStream;
|
||||
QThread loggerThread;
|
||||
bool started;
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user