From d7386cdfa9d741e5288134cef29e387f03971560 Mon Sep 17 00:00:00 2001 From: omigamedev Date: Sat, 13 Jul 2019 16:48:05 +0200 Subject: [PATCH] add tmp buffer to store messages until the log file is ready --- src/log.cpp | 32 ++++++++++++++++++++++++++------ src/log.h | 3 +++ 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/log.cpp b/src/log.cpp index 8102960..aa7797b 100644 --- a/src/log.cpp +++ b/src/log.cpp @@ -74,35 +74,51 @@ void LogRemote::net_close() } void LogRemote::file_init() { + std::lock_guard _lock(m_mutex); if (!m_logfile.is_open()) m_logfile.open(App::I->data_path + "/panopainter-log.txt"); + if (m_logfile.is_open() && !m_tmp.empty()) + { + for (auto const& s : m_tmp) + m_logfile.write(s.data(), s.size()); + m_logfile.flush(); + m_tmp.clear(); + } } void LogRemote::file_close() { + std::lock_guard _lock(m_mutex); if (!m_logfile.is_open()) m_logfile.close(); } void LogRemote::log(const char* format, ...) { + std::lock_guard _lock(m_mutex); static char buffer[4096]; va_list arglist; va_start(arglist, format); int n = vsnprintf(buffer, sizeof(buffer), format, arglist); va_end(arglist); m_mq.Post(std::string(buffer, n)); + auto line = std::string(buffer, n) + "\n"; if (m_logfile.is_open()) { - auto line = std::string(buffer, n) + "\n"; m_logfile.write(line.data(), line.size()); m_logfile.flush(); } + else + { + m_tmp.push_back(line); + } #if _WIN32 - auto line = "DBG: " + std::string(buffer, n) + "\n"; - OutputDebugStringA(line.c_str()); + auto line_console = "DBG: " + line; + OutputDebugStringA(line_console.c_str()); #endif } void LogRemote::log(const wchar_t* format, ...) { + std::lock_guard _lock(m_mutex); + static wchar_t buffer[4096]; va_list arglist; va_start(arglist, format); @@ -125,15 +141,19 @@ void LogRemote::log(const wchar_t* format, ...) //std::string converted_str = converter.to_bytes(string_to_convert); m_mq.Post(std::string(converted)); + auto line = converted + "\n"; if (m_logfile.is_open()) { - auto line = converted + "\n"; m_logfile.write(line.data(), line.size()); m_logfile.flush(); } + else + { + m_tmp.push_back(line); + } #if _WIN32 - auto line = L"DBG: " + std::wstring(buffer, n) + L"\n"; - OutputDebugStringW(line.c_str()); + auto line_console = L"DBG: " + std::wstring(buffer, n) + L"\n"; + OutputDebugStringW(line_console.c_str()); #endif } LogRemote::~LogRemote() diff --git a/src/log.h b/src/log.h index 1d319d8..5707b04 100644 --- a/src/log.h +++ b/src/log.h @@ -17,7 +17,10 @@ public: bool m_running = false; bool m_error = false; std::thread m_thread; + std::mutex m_mutex; BlockingQueue m_mq; + // Store messages until the file is open + std::vector m_tmp; CURL *curl = nullptr; CURLcode res; std::string readBuffer;