1
0
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:
Philippe Renon 2017-03-17 23:42:59 +01:00
parent 29005473d4
commit 07b30ba290
2 changed files with 39 additions and 25 deletions

View File

@ -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;
}

View File

@ -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;
};