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 2026/05/31 08:08:33 UTC

(logging-log4cxx) 02/02: Ensure a change to the shared ThreadUtility isActive flag is visible

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

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

commit f9f42d3ba4014c4d53ed0f58c12aba62f736a016
Merge: 1cb74b81 ba5b469a
Author: Stephen Webb <sw...@gmail.com>
AuthorDate: Sun May 31 16:09:37 2026 +1000

    Ensure a change to the shared ThreadUtility isActive flag is visible

 src/main/cpp/threadutility.cpp    | 10 ++++++++--
 src/test/cpp/CMakeLists.txt       |  5 ++++-
 src/test/cpp/fileappendertest.cpp |  3 +++
 3 files changed, 15 insertions(+), 3 deletions(-)

diff --cc src/main/cpp/threadutility.cpp
index 63195442,0ffcc140..e5cf569a
--- a/src/main/cpp/threadutility.cpp
+++ b/src/main/cpp/threadutility.cpp
@@@ -87,9 -87,15 +87,15 @@@ struct ThreadUtility::priv_dat
  
  	void doPeriodicTasks();
  
- 	void stopThread()
+ 	void setTerminated()
  	{
 -		std::lock_guard<std::mutex> lock(interrupt_mutex);
++		std::lock_guard<std::recursive_mutex> lock(job_mutex);
  		terminated.store(true);
+ 	}
+ 
+ 	void stopThread()
+ 	{
+ 		setTerminated();
  		interrupt.notify_all();
  		if (thread.joinable())
  			thread.join();
@@@ -274,12 -280,8 +280,12 @@@ void ThreadUtility::addPeriodicTask(con
  	if (!m_priv->thread.joinable())
  	{
  		m_priv->terminated.store(false);
 -		m_priv->threadIsActive = true;
 -		m_priv->thread = createThread(LOG4CXX_STR("log4cxx"), std::bind(&priv_data::doPeriodicTasks, m_priv.get()));
++		m_priv->threadIsActive.store(true);
 +		m_priv->thread = createThread(LOG4CXX_STR("log4cxx"), [this]()
 +			{
- 				m_priv->threadIsActive.store(true);
 +				m_priv->doPeriodicTasks();
 +				m_priv->threadIsActive.store(false);
 +			});
  	}
  	else
  		m_priv->interrupt.notify_one();
diff --cc src/test/cpp/CMakeLists.txt
index f20a84f8,f20a84f8..28ebd7cf
--- a/src/test/cpp/CMakeLists.txt
+++ b/src/test/cpp/CMakeLists.txt
@@@ -124,7 -124,7 +124,10 @@@ else(
    set(TEST_COMPILE_DEFINITIONS _DEBUG)
  endif()
  if(LOG4CXX_TEST_ONLY_BUILD)
--  list(APPEND TEST_COMPILE_DEFINITIONS "ENABLE_FAILING_APPENDER_SIMULATION_TESTING=1")
++  list(APPEND TEST_COMPILE_DEFINITIONS
++      "ENABLE_FAILING_APPENDER_SIMULATION_TESTING=1"
++      "LOGLOG_THRESHOLD=1"
++  )
  endif()
  
  get_filename_component(UNIT_TEST_WORKING_DIR ../resources ABSOLUTE)
diff --cc src/test/cpp/fileappendertest.cpp
index 1c874b46,1c874b46..c87c0bae
--- a/src/test/cpp/fileappendertest.cpp
+++ b/src/test/cpp/fileappendertest.cpp
@@@ -159,6 -159,6 +159,7 @@@ public
  	{
  		int requiredMsgCount = 100;
  		auto logger = getLogger(LOG4CXX_STR("100message"));
++		LOGLOG_DEBUG(logger, "writeFinalBufferOutput: " << "configuing");
  
  		// Set up a new file
  		LogString dir{ LOG4CXX_STR("output/newdir") };
@@@ -174,10 -174,10 +175,12 @@@
  		logger->setAdditivity(false);
  		logger->addAppender(writer);
  
++		LOGLOG_DEBUG(logger, "writeFinalBufferOutput: " << "started");
  		for ( int x = 0; x < requiredMsgCount; x++ )
  		{
  			LOG4CXX_INFO( logger, "This is test message " << x );
  		}
++		LOGLOG_DEBUG(logger, "writeFinalBufferOutput: " << "stopped");
  	}
  
  	void checkFinalBufferOutput()