From b3da86bf08fbdbdbabc3477aec9b58acb4181b6d Mon Sep 17 00:00:00 2001 From: John Preston Date: Mon, 8 Feb 2016 13:50:56 +0300 Subject: [PATCH] closing logs and working file before relaunching Telegram --- Telegram/SourceFiles/logs.cpp | 20 +++++++++++++++++++- Telegram/SourceFiles/logs.h | 2 ++ Telegram/SourceFiles/pspecific_linux.cpp | 2 ++ Telegram/SourceFiles/pspecific_mac_p.mm | 4 +++- Telegram/SourceFiles/pspecific_wnd.cpp | 2 ++ 5 files changed, 28 insertions(+), 2 deletions(-) diff --git a/Telegram/SourceFiles/logs.cpp b/Telegram/SourceFiles/logs.cpp index f5b6ac4c6..2dfea02f2 100644 --- a/Telegram/SourceFiles/logs.cpp +++ b/Telegram/SourceFiles/logs.cpp @@ -98,6 +98,14 @@ public: return reopen(LogDataMain, 0, qsl("start")); } + void closeMain() { + QMutexLocker lock(_logsMutex(LogDataMain)); + if (files[LogDataMain]) { + streams[LogDataMain].setDevice(0); + files[LogDataMain]->close(); + } + } + bool instanceChecked() { return reopen(LogDataMain, 0, QString()); } @@ -433,6 +441,13 @@ namespace Logs { LogsBeforeSingleInstanceChecked.clear(); } + void closeMain() { + LOG(("Explicitly closing main log and finishing crash handlers.")); + if (LogsData) { + LogsData->closeMain(); + } + } + void writeMain(const QString &v) { time_t t = time(NULL); struct tm tm; @@ -490,7 +505,7 @@ namespace Logs { return LogsBeforeSingleInstanceChecked; } - int32 size = 0; + int32 size = LogsBeforeSingleInstanceChecked.size(); for (LogsInMemoryList::const_iterator i = LogsInMemory->cbegin(), e = LogsInMemory->cend(); i != e; ++i) { if (i->first == LogDataMain) { size += i->second.size(); @@ -498,6 +513,9 @@ namespace Logs { } QString result; result.reserve(size); + if (!LogsBeforeSingleInstanceChecked.isEmpty()) { + result.append(LogsBeforeSingleInstanceChecked); + } for (LogsInMemoryList::const_iterator i = LogsInMemory->cbegin(), e = LogsInMemory->cend(); i != e; ++i) { if (i->first == LogDataMain) { result += i->second; diff --git a/Telegram/SourceFiles/logs.h b/Telegram/SourceFiles/logs.h index e8e2c9998..09d4567ea 100644 --- a/Telegram/SourceFiles/logs.h +++ b/Telegram/SourceFiles/logs.h @@ -32,6 +32,8 @@ namespace Logs { bool instanceChecked(); void multipleInstances(); + void closeMain(); + void writeMain(const QString &v); void writeDebug(const char *file, int32 line, const QString &v); diff --git a/Telegram/SourceFiles/pspecific_linux.cpp b/Telegram/SourceFiles/pspecific_linux.cpp index 6eec66295..4117a5f26 100644 --- a/Telegram/SourceFiles/pspecific_linux.cpp +++ b/Telegram/SourceFiles/pspecific_linux.cpp @@ -1411,6 +1411,8 @@ bool _execUpdater(bool update = true, const QString &crashreport = QString()) { } } + Logs::closeMain(); + SignalHandlers::finish(); pid_t pid = fork(); switch (pid) { case -1: return false; diff --git a/Telegram/SourceFiles/pspecific_mac_p.mm b/Telegram/SourceFiles/pspecific_mac_p.mm index ca7db5d83..4c2acf169 100644 --- a/Telegram/SourceFiles/pspecific_mac_p.mm +++ b/Telegram/SourceFiles/pspecific_mac_p.mm @@ -978,8 +978,10 @@ BOOL _execUpdater(BOOL update = YES, const QString &crashreport = QString()) { } DEBUG_LOG(("Application Info: executing %1 %2").arg(objcString(path)).arg(objcString([args componentsJoinedByString:@" "]))); + Logs::closeMain(); + SignalHandlers::finish(); if (![NSTask launchedTaskWithLaunchPath:path arguments:args]) { - LOG(("Task not launched while executing %1 %2").arg(objcString(path)).arg(objcString([args componentsJoinedByString:@" "]))); + DEBUG_LOG(("Task not launched while executing %1 %2").arg(objcString(path)).arg(objcString([args componentsJoinedByString:@" "]))); return NO; } } diff --git a/Telegram/SourceFiles/pspecific_wnd.cpp b/Telegram/SourceFiles/pspecific_wnd.cpp index 4ff51a0cb..84c165c80 100644 --- a/Telegram/SourceFiles/pspecific_wnd.cpp +++ b/Telegram/SourceFiles/pspecific_wnd.cpp @@ -2284,6 +2284,8 @@ void psExecTelegram(const QString &crashreport) { QString telegram(QDir::toNativeSeparators(cExeDir() + cExeName())), wdir(QDir::toNativeSeparators(cWorkingDir())); DEBUG_LOG(("Application Info: executing %1 %2").arg(cExeDir() + cExeName()).arg(targs)); + Logs::closeMain(); + SignalHandlers::finish(); HINSTANCE r = ShellExecute(0, 0, telegram.toStdWString().c_str(), targs.toStdWString().c_str(), wdir.isEmpty() ? 0 : wdir.toStdWString().c_str(), SW_SHOWNORMAL); if (long(r) < 32) { DEBUG_LOG(("Application Error: failed to execute %1, working directory: '%2', result: %3").arg(telegram).arg(wdir).arg(long(r)));