You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by sw...@apache.org on 2024/07/26 00:00:02 UTC

(logging-log4cxx) 01/01: Improve asyncappender robustness

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

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

commit 23d5811201a312308515870281e9b95cb6f7ac45
Author: Stephen Webb <sw...@gmail.com>
AuthorDate: Fri Jul 26 09:58:56 2024 +1000

    Improve asyncappender robustness
---
 src/main/cpp/asyncappender.cpp | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/src/main/cpp/asyncappender.cpp b/src/main/cpp/asyncappender.cpp
index 69533ff6..99e7b9db 100644
--- a/src/main/cpp/asyncappender.cpp
+++ b/src/main/cpp/asyncappender.cpp
@@ -223,6 +223,11 @@ struct AsyncAppender::AsyncAppenderPriv : public AppenderSkeleton::AppenderSkele
 		std::lock_guard<std::mutex> lock(this->bufferMutex);
 		this->closed = true;
 	}
+
+	/**
+	 * Used to ensure the dispatch thread does not wait when a logging thread is waiting.
+	*/
+	int blockedCount{0};
 };
 
 
@@ -328,10 +333,12 @@ void AsyncAppender::append(const spi::LoggingEventPtr& event, Pool& p)
 			&& !priv->closed
 			&& (priv->dispatcher.get_id() != std::this_thread::get_id()) )
 		{
+			++priv->blockedCount;
 			priv->bufferNotFull.wait(lock, [this]()
 			{
 				return priv->eventCount - priv->dispatchedCount < priv->bufferSize;
 			});
+			--priv->blockedCount;
 			discard = false;
 		}
 
@@ -519,7 +526,7 @@ void AsyncAppender::dispatch()
 		{
 			std::unique_lock<std::mutex> lock(priv->bufferMutex);
 			priv->bufferNotEmpty.wait(lock, [this]() -> bool
-				{ return priv->dispatchedCount != priv->commitCount || priv->closed; }
+				{ return 0 < priv->blockedCount || priv->dispatchedCount != priv->commitCount || priv->closed; }
 			);
 		}
 		isActive = !priv->isClosed();