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();
        }
 };
 

Reply via email to