common/Log.cpp | 15 +++++++++++++++ common/Log.hpp | 35 ++++++++++++++++++----------------- 2 files changed, 33 insertions(+), 17 deletions(-)
New commits: commit ce78fec310ab5ab6aecabb73cad7d782afcb885f Author: Ashod Nakashian <[email protected]> AuthorDate: Sat Apr 20 11:39:20 2019 -0400 Commit: Ashod Nakashian <[email protected]> CommitDate: Tue Apr 23 03:01:00 2019 +0200 wsd: reuse ostringstream when logging This is faster and reduces memory fragmentation. Also, cleans up the logging macros and implementation. Change-Id: I7fb00da041d1261c694c4b48b67a3c66ad0cbf8d Reviewed-on: https://gerrit.libreoffice.org/71020 Reviewed-by: Ashod Nakashian <[email protected]> Tested-by: Ashod Nakashian <[email protected]> diff --git a/common/Log.cpp b/common/Log.cpp index b892c5b4b..46cfd6095 100644 --- a/common/Log.cpp +++ b/common/Log.cpp @@ -126,6 +126,21 @@ namespace Log return buffer; } + // Reuse the same buffer to minimize memory fragmentation. + static thread_local std::ostringstream Oss; + + std::ostringstream& begin(const char* level) + { + // Reset the oss. + Oss.clear(); + Oss.seekp(0); + + // Output the prefix. + char buffer[1024]; + Oss << Log::prefix(buffer, sizeof(buffer) - 1, level) << std::boolalpha; + return Oss; + } + void signalLogPrefix() { char buffer[1024]; diff --git a/common/Log.hpp b/common/Log.hpp index bdc654b39..f4a51d8da 100644 --- a/common/Log.hpp +++ b/common/Log.hpp @@ -54,6 +54,9 @@ namespace Log char* prefix(char* buffer, std::size_t len, const char* level); + /// Starts logging by generating the prefix and returning an oss. + std::ostringstream& begin(const char* level); + inline bool traceEnabled() { return logger().trace(); } inline bool debugEnabled() { return logger().debug(); } inline bool infoEnabled() { return logger().information(); } @@ -237,31 +240,29 @@ namespace Log #define LOG_FILE_NAME(f) (strrchr(f, '/')+1) #endif -#define LOG_END(LOG, FILEP) \ - do \ - { \ - if (FILEP) \ - LOG << "| " << LOG_FILE_NAME(__FILE__) << ':' << __LINE__; \ +#define LOG_END(LOG, FILEP) \ + do \ + { \ + if (FILEP) \ + LOG << "| " << LOG_FILE_NAME(__FILE__) << ':' << __LINE__; \ } while (false) #ifdef __ANDROID__ -#define LOG_BODY_(LOG, PRIO, LVL, X, FILEP) \ - char b_[1024]; \ - std::ostringstream oss_(Log::prefix(b_, sizeof(b_) - 1, LVL), std::ostringstream::ate); \ - oss_ << std::boolalpha << X; \ - LOG_END(oss_, FILEP); \ +#define LOG_BODY_(LOG, PRIO, LVL, X, FILEP) \ + std::ostringstream& oss_ = Log::begin(LVL); \ + oss_ << X; \ + LOG_END(oss_, FILEP); \ ((void)__android_log_print(ANDROID_LOG_DEBUG, "loolwsd", "%s %s", LVL, oss_.str().c_str())) #else -#define LOG_BODY_(LOG, PRIO, LVL, X, FILEP) \ - Poco::Message m_(LOG.name(), "", Poco::Message::PRIO_##PRIO); \ - char b_[1024]; \ - std::ostringstream oss_(Log::prefix(b_, sizeof(b_) - 1, LVL), std::ostringstream::ate); \ - oss_ << std::boolalpha << X; \ - LOG_END(oss_, FILEP); \ - m_.setText(oss_.str()); \ +#define LOG_BODY_(LOG, PRIO, LVL, X, FILEP) \ + Poco::Message m_(LOG.name(), "", Poco::Message::PRIO_##PRIO); \ + std::ostringstream& oss_ = Log::begin(LVL); \ + oss_ << X; \ + LOG_END(oss_, FILEP); \ + m_.setText(oss_.str()); \ LOG.log(m_); #endif _______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
