From 32572ac2abf83306a5dcd0b5cde88263ebaebe99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Atgeirr=20Fl=C3=B8=20Rasmussen?= Date: Tue, 30 Apr 2019 12:24:31 +0200 Subject: [PATCH] Clear DeferredLogger's message container after logging. This keeps from logging the same messages again. Also add clearMessages() method, which is useful to clear the local container after gathering into a global container (which leaves the local containers untouched). --- opm/simulators/DeferredLogger.cpp | 6 ++++++ opm/simulators/DeferredLogger.hpp | 5 +++++ opm/simulators/DeferredLoggingErrorHelpers.hpp | 4 ++++ 3 files changed, 15 insertions(+) diff --git a/opm/simulators/DeferredLogger.cpp b/opm/simulators/DeferredLogger.cpp index ef3eb806d..1c222598d 100644 --- a/opm/simulators/DeferredLogger.cpp +++ b/opm/simulators/DeferredLogger.cpp @@ -86,6 +86,12 @@ namespace Opm for (const auto& m : messages_) { OpmLog::addTaggedMessage(m.flag, m.tag, m.text); } + messages_.clear(); + } + + void DeferredLogger::clearMessages() + { + messages_.clear(); } } // namespace Opm diff --git a/opm/simulators/DeferredLogger.hpp b/opm/simulators/DeferredLogger.hpp index ef279dce1..ec02889bf 100644 --- a/opm/simulators/DeferredLogger.hpp +++ b/opm/simulators/DeferredLogger.hpp @@ -60,8 +60,13 @@ namespace Opm void debug(const std::string& message); void note(const std::string& message); + /// Log all messages to the OpmLog backends, + /// and clear the message container. void logMessages(); + /// Clear the message container without logging them. + void clearMessages(); + private: std::vector messages_; friend Opm::DeferredLogger gatherDeferredLogger(const Opm::DeferredLogger& local_deferredlogger); diff --git a/opm/simulators/DeferredLoggingErrorHelpers.hpp b/opm/simulators/DeferredLoggingErrorHelpers.hpp index 6ca1a908b..72c420709 100644 --- a/opm/simulators/DeferredLoggingErrorHelpers.hpp +++ b/opm/simulators/DeferredLoggingErrorHelpers.hpp @@ -63,6 +63,10 @@ inline void logAndCheckForExceptionsAndThrow(Opm::DeferredLogger& deferred_logge if (terminal_output) { global_deferredLogger.logMessages(); } + // Now that all messages have been logged, they are automatically + // cleared from the global logger, but we must also clear them + // from the local logger. + deferred_logger.clearMessages(); const auto& cc = Dune::MPIHelper::getCollectiveCommunication(); if (cc.max(exception_thrown) == 1) { throw std::logic_error(message);