You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by rm...@apache.org on 2021/08/21 03:45:56 UTC
[logging-log4cxx] 01/04: Turned the thread utility into a singleton
This is an automated email from the ASF dual-hosted git repository.
rmiddleton pushed a commit to branch LOGCXX-431
in repository https://gitbox.apache.org/repos/asf/logging-log4cxx.git
commit 39bbf1b3bc17b60c7fc54c7f3e20ffa18ae2770d
Author: Robert Middleton <ro...@rm5248.com>
AuthorDate: Fri Aug 20 23:19:01 2021 -0400
Turned the thread utility into a singleton
---
src/main/cpp/asyncappender.cpp | 2 +-
src/main/cpp/filewatchdog.cpp | 2 +-
src/main/cpp/socketappenderskeleton.cpp | 2 +-
src/main/cpp/sockethubappender.cpp | 2 +-
src/main/cpp/telnetappender.cpp | 2 +-
src/main/cpp/threadutility.cpp | 66 +++++++++++++----------
src/main/include/CMakeLists.txt | 2 +
src/main/include/log4cxx/helpers/threadutility.h | 68 +++++++++++++-----------
8 files changed, 80 insertions(+), 66 deletions(-)
diff --git a/src/main/cpp/asyncappender.cpp b/src/main/cpp/asyncappender.cpp
index c9f87ad..7ab05b7 100644
--- a/src/main/cpp/asyncappender.cpp
+++ b/src/main/cpp/asyncappender.cpp
@@ -51,7 +51,7 @@ AsyncAppender::AsyncAppender()
locationInfo(false),
blocking(true)
{
- dispatcher = ThreadUtility::createThread( LOG4CXX_STR("AyncAppend"), &AsyncAppender::dispatch, this );
+ dispatcher = ThreadUtility::instance()->createThread( LOG4CXX_STR("AyncAppend"), &AsyncAppender::dispatch, this );
}
AsyncAppender::~AsyncAppender()
diff --git a/src/main/cpp/filewatchdog.cpp b/src/main/cpp/filewatchdog.cpp
index 14942cd..3848ed3 100644
--- a/src/main/cpp/filewatchdog.cpp
+++ b/src/main/cpp/filewatchdog.cpp
@@ -93,7 +93,7 @@ void FileWatchdog::start()
{
checkAndConfigure();
- thread = ThreadUtility::createThread( LOG4CXX_STR("Filewatchdog"), &FileWatchdog::run, this );
+ thread = ThreadUtility::instance()->createThread( LOG4CXX_STR("Filewatchdog"), &FileWatchdog::run, this );
}
bool FileWatchdog::is_interrupted()
diff --git a/src/main/cpp/socketappenderskeleton.cpp b/src/main/cpp/socketappenderskeleton.cpp
index a310cba..e3e1375 100644
--- a/src/main/cpp/socketappenderskeleton.cpp
+++ b/src/main/cpp/socketappenderskeleton.cpp
@@ -163,7 +163,7 @@ void SocketAppenderSkeleton::fireConnector()
{
LogLog::debug(LOG4CXX_STR("Connector thread not alive: starting monitor."));
- thread = ThreadUtility::createThread( LOG4CXX_STR("SocketAppend"), &SocketAppenderSkeleton::monitor, this );
+ thread = ThreadUtility::instance()->createThread( LOG4CXX_STR("SocketAppend"), &SocketAppenderSkeleton::monitor, this );
}
}
diff --git a/src/main/cpp/sockethubappender.cpp b/src/main/cpp/sockethubappender.cpp
index 73d821a..7d83a23 100644
--- a/src/main/cpp/sockethubappender.cpp
+++ b/src/main/cpp/sockethubappender.cpp
@@ -178,7 +178,7 @@ void SocketHubAppender::append(const spi::LoggingEventPtr& event, Pool& p)
void SocketHubAppender::startServer()
{
- thread = ThreadUtility::createThread( LOG4CXX_STR("SocketHub"), &SocketHubAppender::monitor, this );
+ thread = ThreadUtility::instance()->createThread( LOG4CXX_STR("SocketHub"), &SocketHubAppender::monitor, this );
}
void SocketHubAppender::monitor()
diff --git a/src/main/cpp/telnetappender.cpp b/src/main/cpp/telnetappender.cpp
index 9dc813a..7e1d6f5 100644
--- a/src/main/cpp/telnetappender.cpp
+++ b/src/main/cpp/telnetappender.cpp
@@ -62,7 +62,7 @@ void TelnetAppender::activateOptions(Pool& /* p */)
serverSocket->setSoTimeout(1000);
}
- sh = ThreadUtility::createThread( LOG4CXX_STR("TelnetAppend"), &TelnetAppender::acceptConnections, this );
+ sh = ThreadUtility::instance()->createThread( LOG4CXX_STR("TelnetAppend"), &TelnetAppender::acceptConnections, this );
}
void TelnetAppender::setOption(const LogString& option,
diff --git a/src/main/cpp/threadutility.cpp b/src/main/cpp/threadutility.cpp
index c7990d9..165803b 100644
--- a/src/main/cpp/threadutility.cpp
+++ b/src/main/cpp/threadutility.cpp
@@ -11,35 +11,36 @@
using log4cxx::ThreadUtility;
-log4cxx::pre_thread_start ThreadUtility::pre_start = ThreadUtility::preThreadDoNothing;
-log4cxx::thread_started ThreadUtility::thread_start = ThreadUtility::threadStartedDoNothing;
-log4cxx::post_thread_start ThreadUtility::post_start = ThreadUtility::postThreadDoNothing;
+struct ThreadUtility::priv_data{
+ priv_data(){
+ pre_start = nullptr;
+ thread_start = nullptr;
+ post_start = nullptr;
+ }
-ThreadUtility::ThreadUtility(){}
+ log4cxx::pre_thread_start pre_start;
+ log4cxx::thread_started thread_start;
+ log4cxx::post_thread_start post_start;
+};
-void ThreadUtility::configureThreadFunctions( pre_thread_start pre_start1,
- thread_started started,
- post_thread_start post_start1 ){
- if( pre_start1 == nullptr ){
- pre_start = ThreadUtility::preThreadDoNothing;
- }else{
- pre_start = pre_start1;
- }
+ThreadUtility::ThreadUtility() :
+ m_priv( new priv_data() )
+{}
- if( started == nullptr ){
- thread_start = ThreadUtility::threadStartedDoNothing;
- }else{
- thread_start = started;
- }
+ThreadUtility::~ThreadUtility(){}
- if( post_start1 == nullptr ){
- post_start = ThreadUtility::postThreadDoNothing;
- }else{
- post_start = pre_start1;
- }
+std::shared_ptr<ThreadUtility> ThreadUtility::instance(){
+ static std::shared_ptr<ThreadUtility> instance( new ThreadUtility() );
+ return instance;
}
-void ThreadUtility::preThreadDoNothing(){}
+void ThreadUtility::configureThreadFunctions( pre_thread_start pre_start1,
+ thread_started started,
+ post_thread_start post_start1 ){
+ m_priv->pre_start = pre_start1;
+ m_priv->thread_start = started;
+ m_priv->post_start = post_start1;
+}
void ThreadUtility::preThreadBlockSignals(){
#if LOG4CXX_HAS_PTHREAD_SIGMASK
@@ -51,10 +52,6 @@ void ThreadUtility::preThreadBlockSignals(){
#endif /* LOG4CXX_HAS_PTHREAD_SIGMASK */
}
-void ThreadUtility::threadStartedDoNothing(LogString,
- std::thread::id,
- std::thread::native_handle_type){}
-
void ThreadUtility::threadStartedNameThread(LogString threadName,
std::thread::id /*thread_id*/,
std::thread::native_handle_type native_handle){
@@ -70,8 +67,6 @@ void ThreadUtility::threadStartedNameThread(LogString threadName,
#endif
}
-void ThreadUtility::postThreadDoNothing(){}
-
void ThreadUtility::postThreadUnblockSignals(){
#if LOG4CXX_HAS_PTHREAD_SIGMASK
sigset_t set;
@@ -81,3 +76,16 @@ void ThreadUtility::postThreadUnblockSignals(){
}
#endif /* LOG4CXX_HAS_PTHREAD_SIGMASK */
}
+
+
+log4cxx::pre_thread_start ThreadUtility::preStartFunction(){
+ return m_priv->pre_start;
+}
+
+log4cxx::thread_started ThreadUtility::threadStartedFunction(){
+ return m_priv->thread_start;
+}
+
+log4cxx::post_thread_start ThreadUtility::postStartFunction(){
+ return m_priv->post_start;
+}
diff --git a/src/main/include/CMakeLists.txt b/src/main/include/CMakeLists.txt
index 558eaeb..9905434 100644
--- a/src/main/include/CMakeLists.txt
+++ b/src/main/include/CMakeLists.txt
@@ -96,6 +96,8 @@ if(UNIX)
# it anyway, we're only going to worry about linux.
include(${LOG4CXX_SOURCE_DIR}/src/cmake/pthread/log4cxx-pthread.cmake)
set(HAS_PTHREAD_SETNAME ${PTHREAD_SETNAME_NP_FOUND})
+
+ message("setname np: ${PTHREAD_SETNAME_NP_FOUND}")
endif(UNIX)
if(WIN32)
diff --git a/src/main/include/log4cxx/helpers/threadutility.h b/src/main/include/log4cxx/helpers/threadutility.h
index de4ffad..4111a0d 100644
--- a/src/main/include/log4cxx/helpers/threadutility.h
+++ b/src/main/include/log4cxx/helpers/threadutility.h
@@ -3,6 +3,7 @@
#include <thread>
#include <functional>
+#include <memory>
#include "log4cxx/logstring.h"
@@ -34,79 +35,82 @@ typedef std::function<void( LogString threadName,
*/
typedef std::function<void()> post_thread_start;
+class ThreadUtility;
+LOG4CXX_PTR_DEF(ThreadUtility);
+
class LOG4CXX_EXPORT ThreadUtility {
+private:
+ ThreadUtility();
+
+ log4cxx::pre_thread_start preStartFunction();
+ log4cxx::thread_started threadStartedFunction();
+ log4cxx::post_thread_start postStartFunction();
+
+ struct priv_data;
+ std::unique_ptr<priv_data> m_priv;
+
public:
+ ~ThreadUtility();
+
+ static std::shared_ptr<ThreadUtility> instance();
+
/**
* Configure the thread functions that log4cxx will use.
* Note that setting any of these parameters to nullptr will cause the
* default function to be used.
*
*/
- static void configureThreadFunctions( pre_thread_start pre_start,
+ void configureThreadFunctions( pre_thread_start pre_start,
thread_started started,
post_thread_start post_start );
/**
- * A pre-start thread function that does nothing
- */
- static void preThreadDoNothing();
-
- /**
* A pre-start thread function that blocks signals to the new thread
* (if the system has pthreads). If the system does not have pthreads,
* is equivalent to preThreadDoNothing();
*/
- static void preThreadBlockSignals();
-
- /**
- * A thread_started function that does nothing when the thread starts.
- */
- static void threadStartedDoNothing(LogString threadName,
- std::thread::id thread_id,
- std::thread::native_handle_type native_handle);
+ void preThreadBlockSignals();
/**
* A thread_started function that names the thread using the appropriate
* system call.
*/
- static void threadStartedNameThread(LogString threadName,
+ void threadStartedNameThread(LogString threadName,
std::thread::id thread_id,
std::thread::native_handle_type native_handle);
/**
- * A post-start thread function that does nothing.
- */
- static void postThreadDoNothing();
-
- /**
* A post-start thread function that unblocks signals that preThreadBlockSignals
* blocked before starting the thread. If the system does not have pthreads,
* is equivalent to postThreadDoNothing();
*/
- static void postThreadUnblockSignals();
+ void postThreadUnblockSignals();
/**
* Start a thread
*/
template<class Function, class... Args>
- static std::thread createThread(LogString name,
+ std::thread createThread(LogString name,
Function&& f,
Args&&... args){
- pre_start();
+ log4cxx::pre_thread_start pre_start = preStartFunction();
+ log4cxx::thread_started thread_start = threadStartedFunction();
+ log4cxx::post_thread_start post_start = postStartFunction();
+
+ if( pre_start ){
+ pre_start();
+ }
std::thread t( f, args... );
- thread_start( name,
+ if( thread_start ){
+ thread_start( name,
t.get_id(),
t.native_handle() );
- post_start();
+ }
+ if( post_start ){
+ post_start();
+ }
return t;
}
-
-private:
- ThreadUtility();
-
- static log4cxx::pre_thread_start pre_start;
- static log4cxx::thread_started thread_start;
- static log4cxx::post_thread_start post_start;
};
}