This is an automated email from the ASF dual-hosted git repository.

swebb2066 pushed a commit to branch remove_async_dispatch_thread_logging_test
in repository https://gitbox.apache.org/repos/asf/logging-log4cxx.git

commit 5f839d4b42cbc0308b51940fea744360adda639e
Author: Stephen Webb <[email protected]>
AuthorDate: Fri Sep 26 13:23:24 2025 +1000

    Improve AsyncAppender unit test reliability
---
 src/main/cpp/asyncappender.cpp         | 23 ++++++++++++++++++++++-
 src/test/cpp/asyncappendertestcase.cpp | 13 +------------
 2 files changed, 23 insertions(+), 13 deletions(-)

diff --git a/src/main/cpp/asyncappender.cpp b/src/main/cpp/asyncappender.cpp
index cec9f359..ab7adb35 100644
--- a/src/main/cpp/asyncappender.cpp
+++ b/src/main/cpp/asyncappender.cpp
@@ -227,7 +227,7 @@ struct AsyncAppender::AsyncAppenderPriv : public 
AppenderSkeleton::AppenderSkele
        /**
         * Used to ensure the dispatch thread does not wait when a logging 
thread is waiting.
        */
-       int blockedCount{0};
+       alignas(hardware_constructive_interference_size) int blockedCount{0};
 };
 
 
@@ -285,6 +285,7 @@ void AsyncAppender::append(const spi::LoggingEventPtr& 
event, Pool& p)
        if (priv->bufferSize <= 0)
        {
                priv->appenders.appendLoopOnAppenders(event, p);
+               return;
        }
 
        // Get a copy of this thread's diagnostic context
@@ -525,6 +526,9 @@ DiscardSummary::createEvent(::LOG4CXX_NS::helpers::Pool& p,
 void AsyncAppender::dispatch()
 {
        size_t discardCount = 0;
+       size_t iterationCount = 0;
+       size_t waitCount = 0;
+       size_t blockedCount = 0;
        std::vector<size_t> pendingCountHistogram(priv->bufferSize, 0);
        bool isActive = true;
 
@@ -537,7 +541,9 @@ void AsyncAppender::dispatch()
                        std::this_thread::yield(); // Wait a bit
                if (priv->dispatchedCount == priv->commitCount)
                {
+                       ++waitCount;
                        std::unique_lock<std::mutex> lock(priv->bufferMutex);
+                       blockedCount += priv->blockedCount;
                        priv->bufferNotEmpty.wait(lock, [this]() -> bool
                                { return 0 < priv->blockedCount || 
priv->dispatchedCount != priv->commitCount || priv->closed; }
                        );
@@ -587,11 +593,26 @@ void AsyncAppender::dispatch()
                                }
                        }
                }
+               ++iterationCount;
        }
        if (LogLog::isDebugEnabled())
        {
                Pool p;
                LogString msg(LOG4CXX_STR("AsyncAppender"));
+#ifdef _DEBUG
+               msg += LOG4CXX_STR(" iterationCount ");
+               StringHelper::toString(iterationCount, p, msg);
+               msg += LOG4CXX_STR(" waitCount ");
+               StringHelper::toString(waitCount, p, msg);
+               msg += LOG4CXX_STR(" blockedCount ");
+               StringHelper::toString(blockedCount, p, msg);
+               msg += LOG4CXX_STR(" eventCount ");
+               StringHelper::toString(priv->eventCount, p, msg);
+               msg += LOG4CXX_STR(" commitCount ");
+               StringHelper::toString(priv->commitCount, p, msg);
+#endif
+               msg += LOG4CXX_STR(" dispatchedCount ");
+               StringHelper::toString(priv->dispatchedCount, p, msg);
                msg += LOG4CXX_STR(" discardCount ");
                StringHelper::toString(discardCount, p, msg);
                msg += LOG4CXX_STR(" pendingCountHistogram");
diff --git a/src/test/cpp/asyncappendertestcase.cpp 
b/src/test/cpp/asyncappendertestcase.cpp
index 206efc1f..374387b0 100644
--- a/src/test/cpp/asyncappendertestcase.cpp
+++ b/src/test/cpp/asyncappendertestcase.cpp
@@ -87,18 +87,6 @@ class BlockableVectorAppender : public VectorAppender
                {
                        std::lock_guard<std::mutex> lock( blocker );
                        VectorAppender::append(event, p);
-
-                       //
-                       //   if fatal, echo messages for testLoggingInDispatcher
-                       //
-                       if (event->getLevel() == Level::getInfo())
-                       {
-                               LoggerPtr logger = 
Logger::getLoggerLS(event->getLoggerName());
-                               LOG4CXX_LOGLS(logger, Level::getError(), 
event->getMessage());
-                               LOG4CXX_LOGLS(logger, Level::getWarn(), 
event->getMessage());
-                               LOG4CXX_LOGLS(logger, Level::getInfo(), 
event->getMessage());
-                               LOG4CXX_LOGLS(logger, Level::getDebug(), 
event->getMessage());
-                       }
                }
 
                std::mutex& getBlocker()
@@ -349,6 +337,7 @@ class AsyncAppenderTestCase : public 
AppenderSkeletonTestCase
                        async->close();
                        const std::vector<spi::LoggingEventPtr>& events = 
blockableAppender->getVector();
                        LOGUNIT_ASSERT(!events.empty());
+                       LOGUNIT_ASSERT(events.size() <= 142);
                        LoggingEventPtr initialEvent = events.front();
                        LoggingEventPtr discardEvent = events.back();
                        LOGUNIT_ASSERT(initialEvent->getMessage() == 
LOG4CXX_STR("Hello, World"));

Reply via email to