This is an automated email from the ASF dual-hosted git repository. swebb2066 pushed a commit to branch restore_logging_event_performance in repository https://gitbox.apache.org/repos/asf/logging-log4cxx.git
commit 78f7278a7333ec4791dc06fc07141023d97d90c6 Author: Stephen Webb <[email protected]> AuthorDate: Fri Aug 28 14:30:30 2026 +1000 Restore LoggingEvent throughput performance --- src/main/cpp/loggingevent.cpp | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/main/cpp/loggingevent.cpp b/src/main/cpp/loggingevent.cpp index 9bce733f..7bff4a75 100644 --- a/src/main/cpp/loggingevent.cpp +++ b/src/main/cpp/loggingevent.cpp @@ -33,6 +33,9 @@ #include <log4cxx/helpers/messagebuffer.h> #include <log4cxx/helpers/date.h> #include <log4cxx/helpers/optional.h> +#include <atomic> +#include <memory> +#include <thread> using namespace LOG4CXX_NS; using namespace LOG4CXX_NS::spi; @@ -158,11 +161,17 @@ struct LoggingEvent::LoggingEventPrivate * move-assign \c message - a concurrent free/assign of the same * heap buffer. */ - std::once_flag renderOnce; + std::atomic<int> rendered{ 0 } ; void renderMessage() { - std::call_once(this->renderOnce, [this]() + int unrenderedValue{ 0 }; + int isActiveValue{ 1 }; + int renderedValue{ 2 }; + if (rendered.compare_exchange_strong(unrenderedValue, isActiveValue + , std::memory_order_relaxed + , std::memory_order_relaxed + )) { if (!this->messageAppender.empty()) { @@ -171,7 +180,13 @@ struct LoggingEvent::LoggingEventPrivate this->message = buf.extract_str(buf); this->messageAppender.clear(); } - }); + rendered.compare_exchange_strong(isActiveValue, renderedValue + , std::memory_order_relaxed + , std::memory_order_relaxed + ); + } + else while (renderedValue != rendered.load(std::memory_order_relaxed)) + std::this_thread::yield(); } };
