Threads created by Log4cxx no longer depend on APR thread support (#297)

* The FileWatchDog thread no longer uses APR threads

* The AsyncAppendr thread no longer uses APR threads

* Synchonization should not depend on APR threads

* Use pthread_self() instead of apr_os_thread_current() in non-WIN32 systems

* Add a test to ensure the Log4cxx created thread runs
diff --git a/src/examples/cpp/delayedloop.cpp b/src/examples/cpp/delayedloop.cpp
index d176813..1562d51 100644
--- a/src/examples/cpp/delayedloop.cpp
+++ b/src/examples/cpp/delayedloop.cpp
@@ -68,19 +68,11 @@
                 if(configFile.length() > 4 &&
                      configFile.substr(configFile.length() - 4) == ".xml")
                 {
-#if APR_HAS_THREADS
-               xml::DOMConfigurator::configureAndWatch(configFile, 3000);
-#else
-               xml::DOMConfigurator::configure(configFile);
-#endif
+                        xml::DOMConfigurator::configureAndWatch(configFile, 3000);
                 }
                 else
                 {
-#if APR_HAS_THREADS
                         PropertyConfigurator::configureAndWatch(configFile, 3000);
-#else
-                        PropertyConfigurator::configure(configFile);
-#endif
                 }
         }
 
diff --git a/src/main/cpp/aprinitializer.cpp b/src/main/cpp/aprinitializer.cpp
index b27e55a..58c44fa 100644
--- a/src/main/cpp/aprinitializer.cpp
+++ b/src/main/cpp/aprinitializer.cpp
@@ -92,7 +92,6 @@
 #if APR_HAS_THREADS
 	apr_status_t stat = apr_threadkey_private_create(&m_priv->tlsKey, tlsDestructImpl, m_priv->p);
 	assert(stat == APR_SUCCESS);
-	assert(stat == APR_SUCCESS);
 #endif
     apr_status_t stat2 = apr_dbd_init(m_priv->p);
     assert(stat2 == APR_SUCCESS);
@@ -110,9 +109,7 @@
 
 void APRInitializer::stopWatchDogs()
 {
-#if APR_HAS_THREADS
 	std::unique_lock<std::mutex> lock(m_priv->mutex);
-#endif
 
 	while (!m_priv->watchdogs.empty())
 	{
@@ -153,18 +150,14 @@
 void APRInitializer::registerCleanup(FileWatchdog* watchdog)
 {
 	APRInitializer& instance(getInstance());
-#if APR_HAS_THREADS
 	std::unique_lock<std::mutex> lock(instance.m_priv->mutex);
-#endif
 	instance.m_priv->watchdogs.push_back(watchdog);
 }
 
 void APRInitializer::unregisterCleanup(FileWatchdog* watchdog)
 {
 	APRInitializer& instance(getInstance());
-#if APR_HAS_THREADS
 	std::unique_lock<std::mutex> lock(instance.m_priv->mutex);
-#endif
 
 	for (std::list<FileWatchdog*>::iterator iter = instance.m_priv->watchdogs.begin();
 		iter != instance.m_priv->watchdogs.end();
@@ -180,17 +173,13 @@
 
 void APRInitializer::addObject(size_t key, const ObjectPtr& pObject)
 {
-#if APR_HAS_THREADS
 	std::unique_lock<std::mutex> lock(m_priv->mutex);
-#endif
 	m_priv->objects[key] = pObject;
 }
 
 const ObjectPtr& APRInitializer::findOrAddObject(size_t key, std::function<ObjectPtr()> creator)
 {
-#if APR_HAS_THREADS
 	std::unique_lock<std::mutex> lock(m_priv->mutex);
-#endif
 	auto pItem = m_priv->objects.find(key);
 	if (m_priv->objects.end() == pItem)
 		pItem = m_priv->objects.emplace(key, creator()).first;
diff --git a/src/main/cpp/class.cpp b/src/main/cpp/class.cpp
index 18a5c4b..ced24e3 100644
--- a/src/main/cpp/class.cpp
+++ b/src/main/cpp/class.cpp
@@ -171,9 +171,7 @@
 
 void Class::registerClasses()
 {
-#if APR_HAS_THREADS
 	AsyncAppender::registerClass();
-#endif
 	ConsoleAppender::registerClass();
 	FileAppender::registerClass();
 	LOG4CXX_NS::db::ODBCAppender::registerClass();
diff --git a/src/main/cpp/domconfigurator.cpp b/src/main/cpp/domconfigurator.cpp
index f7bc506..186100c 100644
--- a/src/main/cpp/domconfigurator.cpp
+++ b/src/main/cpp/domconfigurator.cpp
@@ -65,7 +65,6 @@
 	spi::LoggerFactoryPtr loggerFactory;
 };
 
-#if APR_HAS_THREADS
 namespace LOG4CXX_NS
 {
 namespace xml
@@ -90,7 +89,6 @@
 }
 }
 XMLWatchdog* DOMConfigurator::xdog = NULL;
-#endif
 
 
 IMPLEMENT_LOG4CXX_OBJECT(DOMConfigurator)
@@ -911,8 +909,6 @@
 spi::ConfigurationStatus DOMConfigurator::configureAndWatch(const std::string& filename, long delay)
 {
 	File file(filename);
-#if APR_HAS_THREADS
-
 	if ( xdog )
 	{
 		APRInitializer::unregisterCleanup(xdog);
@@ -927,17 +923,12 @@
 	xdog->start();
 
 	return status;
-#else
-	return DOMConfigurator().doConfigure(file, LogManager::getLoggerRepository());
-#endif
 }
 
 #if LOG4CXX_WCHAR_T_API
 spi::ConfigurationStatus DOMConfigurator::configureAndWatch(const std::wstring& filename, long delay)
 {
 	File file(filename);
-#if APR_HAS_THREADS
-
 	if ( xdog )
 	{
 		APRInitializer::unregisterCleanup(xdog);
@@ -952,9 +943,6 @@
 	xdog->start();
 
 	return status;
-#else
-	return DOMConfigurator().doConfigure(file, LogManager::getLoggerRepository());
-#endif
 }
 #endif
 
@@ -962,8 +950,6 @@
 spi::ConfigurationStatus DOMConfigurator::configureAndWatch(const std::basic_string<UniChar>& filename, long delay)
 {
 	File file(filename);
-#if APR_HAS_THREADS
-
 	if ( xdog )
 	{
 		APRInitializer::unregisterCleanup(xdog);
@@ -978,9 +964,6 @@
 	xdog->start();
 
 	return status;
-#else
-	return DOMConfigurator().doConfigure(file, LogManager::getLoggerRepository());
-#endif
 }
 #endif
 
@@ -988,8 +971,6 @@
 spi::ConfigurationStatus DOMConfigurator::configureAndWatch(const CFStringRef& filename, long delay)
 {
 	File file(filename);
-#if APR_HAS_THREADS
-
 	if ( xdog )
 	{
 		APRInitializer::unregisterCleanup(xdog);
@@ -1004,9 +985,6 @@
 	xdog->start();
 
 	return status;
-#else
-	return DOMConfigurator().doConfigure(file, LogManager::getLoggerRepository());
-#endif
 }
 #endif
 
diff --git a/src/main/cpp/loggingevent.cpp b/src/main/cpp/loggingevent.cpp
index 0f9e333..129d196 100644
--- a/src/main/cpp/loggingevent.cpp
+++ b/src/main/cpp/loggingevent.cpp
@@ -342,9 +342,9 @@
 #if defined(_WIN32)
 	using ThreadIdType = DWORD;
 	ThreadIdType threadId = GetCurrentThreadId();
-#elif APR_HAS_THREADS
-	using ThreadIdType = apr_os_thread_t;
-	ThreadIdType threadId = apr_os_thread_current();
+#elif LOG4CXX_HAS_PTHREAD_SELF
+	using ThreadIdType = pthread_t;
+	ThreadIdType threadId = pthread_self();
 #else
 	using ThreadIdType = int;
 	ThreadIdType threadId = 0;
@@ -368,22 +368,19 @@
 		return thread_id_string;
 	}
 
-#if APR_HAS_THREADS
 #if defined(_WIN32)
 	char result[20];
 	apr_snprintf(result, sizeof(result), LOG4CXX_WIN32_THREAD_FMTSPEC, threadId);
-#else
-	// apr_os_thread_t encoded in HEX takes needs as many characters
+	Transcoder::decode(reinterpret_cast<const char*>(result), thread_id_string);
+#elif LOG4CXX_HAS_PTHREAD_SELF
+	// pthread_t encoded in HEX takes needs as many characters
 	// as two times the size of the type, plus an additional null byte.
-	char result[sizeof(apr_os_thread_t) * 3 + 10];
+	char result[sizeof(pthread_t) * 3 + 10];
 	apr_snprintf(result, sizeof(result), LOG4CXX_APR_THREAD_FMTSPEC, (void*) &threadId);
-#endif /* _WIN32 */
-
-	LOG4CXX_NS::helpers::Transcoder::decode(reinterpret_cast<const char*>(result), thread_id_string);
-
+	Transcoder::decode(reinterpret_cast<const char*>(result), thread_id_string);
 #else
-    thread_id_string = LOG4CXX_STR("0x00000000");
-#endif /* APR_HAS_THREADS */
+	thread_id_string = LOG4CXX_STR("0x00000000");
+#endif
 	return thread_id_string;
 }
 
diff --git a/src/main/cpp/optionconverter.cpp b/src/main/cpp/optionconverter.cpp
index 7adda4f..5429073 100644
--- a/src/main/cpp/optionconverter.cpp
+++ b/src/main/cpp/optionconverter.cpp
@@ -42,9 +42,8 @@
 	#define LOG4CXX 1
 #endif
 #include <log4cxx/helpers/aprinitializer.h>
-
-#if APR_HAS_THREADS
 #include <log4cxx/helpers/filewatchdog.h>
+
 namespace LOG4CXX_NS
 {
 
@@ -70,7 +69,6 @@
 };
 
 }
-#endif
 
 using namespace LOG4CXX_NS;
 using namespace LOG4CXX_NS::helpers;
@@ -445,7 +443,6 @@
 		configurator = std::make_shared<PropertyConfigurator>();
 	}
 
-#if APR_HAS_THREADS
 	if (0 < delay)
 	{
 		auto dog = new ConfiguratorWatchdog(configurator, configFileName);
@@ -454,6 +451,5 @@
 		dog->start();
 	}
 	else
-#endif
 		configurator->doConfigure(configFileName, hierarchy);
 }
diff --git a/src/main/cpp/propertyconfigurator.cpp b/src/main/cpp/propertyconfigurator.cpp
index 7a873a9..2c54b4b 100644
--- a/src/main/cpp/propertyconfigurator.cpp
+++ b/src/main/cpp/propertyconfigurator.cpp
@@ -49,7 +49,6 @@
 using namespace LOG4CXX_NS::config;
 using namespace LOG4CXX_NS::rolling;
 
-#if APR_HAS_THREADS
 #include <log4cxx/helpers/filewatchdog.h>
 namespace LOG4CXX_NS
 {
@@ -75,8 +74,6 @@
 
 PropertyWatchdog* PropertyConfigurator::pdog = NULL;
 
-#endif
-
 IMPLEMENT_LOG4CXX_OBJECT(PropertyConfigurator)
 
 PropertyConfigurator::PropertyConfigurator()
@@ -135,7 +132,6 @@
 	return PropertyConfigurator().doConfigure(properties, LogManager::getLoggerRepository());
 }
 
-#if APR_HAS_THREADS
 spi::ConfigurationStatus PropertyConfigurator::configureAndWatch(const File& configFilename)
 {
 	return configureAndWatch(configFilename, FileWatchdog::DEFAULT_DELAY);
@@ -161,7 +157,6 @@
 
 	return stat;
 }
-#endif
 
 spi::ConfigurationStatus PropertyConfigurator::doConfigure(helpers::Properties& properties,
 	spi::LoggerRepositoryPtr hierarchy)
diff --git a/src/main/include/CMakeLists.txt b/src/main/include/CMakeLists.txt
index 4e0603d..ff98ca2 100644
--- a/src/main/include/CMakeLists.txt
+++ b/src/main/include/CMakeLists.txt
@@ -136,6 +136,7 @@
 if(UNIX)
     set(CMAKE_REQUIRED_LIBRARIES "pthread")
     CHECK_SYMBOL_EXISTS(pthread_sigmask "signal.h" HAS_PTHREAD_SIGMASK)
+    CHECK_SYMBOL_EXISTS(pthread_self "pthread.h" HAS_PTHREAD_SELF)
 
     # Check for the (linux) pthread_setname_np.
     # OSX and BSD are special apparently.  OSX only lets you name
@@ -160,6 +161,7 @@
   HAS_FWIDE
   HAS_LIBESMTP
   HAS_SYSLOG
+  HAS_PTHREAD_SELF
   HAS_PTHREAD_SIGMASK
   HAS_PTHREAD_SETNAME
   HAS_PTHREAD_GETNAME
diff --git a/src/main/include/log4cxx/private/log4cxx_private.h.in b/src/main/include/log4cxx/private/log4cxx_private.h.in
index 61e8e7a..b7bed0b 100644
--- a/src/main/include/log4cxx/private/log4cxx_private.h.in
+++ b/src/main/include/log4cxx/private/log4cxx_private.h.in
@@ -57,6 +57,7 @@
 #define LOG4CXX_WIN32_THREAD_FMTSPEC "0x%.8x"
 #define LOG4CXX_APR_THREAD_FMTSPEC "0x%pt"
 
+#define LOG4CXX_HAS_PTHREAD_SELF @HAS_PTHREAD_SELF@
 #define LOG4CXX_HAS_PTHREAD_SIGMASK @HAS_PTHREAD_SIGMASK@
 #define LOG4CXX_HAS_PTHREAD_SETNAME @HAS_PTHREAD_SETNAME@
 #define LOG4CXX_HAS_PTHREAD_GETNAME @HAS_PTHREAD_GETNAME@
diff --git a/src/test/cpp/asyncappendertestcase.cpp b/src/test/cpp/asyncappendertestcase.cpp
index dedbded..e7086dc 100644
--- a/src/test/cpp/asyncappendertestcase.cpp
+++ b/src/test/cpp/asyncappendertestcase.cpp
@@ -108,7 +108,6 @@
 
 LOG4CXX_PTR_DEF(BlockableVectorAppender);
 
-#if APR_HAS_THREADS
 /**
  * Tests of AsyncAppender.
  */
@@ -324,4 +323,3 @@
 };
 
 LOGUNIT_TEST_SUITE_REGISTRATION(AsyncAppenderTestCase);
-#endif
diff --git a/src/test/cpp/helpers/charsetencodertestcase.cpp b/src/test/cpp/helpers/charsetencodertestcase.cpp
index b4ca980..65bac6a 100644
--- a/src/test/cpp/helpers/charsetencodertestcase.cpp
+++ b/src/test/cpp/helpers/charsetencodertestcase.cpp
@@ -38,9 +38,7 @@
 	LOGUNIT_TEST(encode3);
 	LOGUNIT_TEST(encode4);
 	LOGUNIT_TEST(encode5);
-#if APR_HAS_THREADS
 	LOGUNIT_TEST(thread1);
-#endif
 	LOGUNIT_TEST_SUITE_END();
 
 	enum { BUFSIZE = 256 };
@@ -237,7 +235,6 @@
 		}
 	}
 
-#if APR_HAS_THREADS
 	class ThreadPackage
 	{
 		public:
@@ -392,7 +389,6 @@
 		LOGUNIT_ASSERT_EQUAL((apr_uint32_t) THREAD_COUNT * THREAD_REPS, package->getPass());
 		delete package;
 	}
-#endif
 
 };
 
diff --git a/src/test/cpp/helpers/threadutilitytestcase.cpp b/src/test/cpp/helpers/threadutilitytestcase.cpp
index effe1ed..1304f89 100644
--- a/src/test/cpp/helpers/threadutilitytestcase.cpp
+++ b/src/test/cpp/helpers/threadutilitytestcase.cpp
@@ -63,6 +63,7 @@
 		auto thrUtil = ThreadUtility::instance();
 		int num_pre = 0;
 		int num_started = 0;
+		int num_run = 0;
 		int num_post = 0;
 
 		thrUtil->configureFuncs(
@@ -82,12 +83,16 @@
 		}
 		);
 
-		std::thread t = thrUtil->createThread( LOG4CXX_STR("FooName"), []() {} );
+		std::thread t = thrUtil->createThread( LOG4CXX_STR("FooName"), [&num_run]()
+		{
+			num_run++;
+		} );
 
 		t.join();
 
 		LOGUNIT_ASSERT_EQUAL( num_pre, 1 );
 		LOGUNIT_ASSERT_EQUAL( num_started, 1 );
+		LOGUNIT_ASSERT_EQUAL( num_run, 1 );
 		LOGUNIT_ASSERT_EQUAL( num_post, 1 );
 	}
 
diff --git a/src/test/cpp/net/socketappendertestcase.cpp b/src/test/cpp/net/socketappendertestcase.cpp
index 0a462cb..2271930 100644
--- a/src/test/cpp/net/socketappendertestcase.cpp
+++ b/src/test/cpp/net/socketappendertestcase.cpp
@@ -21,7 +21,6 @@
 using namespace log4cxx;
 using namespace log4cxx::helpers;
 
-#if APR_HAS_THREADS
 /**
    Unit tests of log4cxx::SocketAppender
  */
@@ -92,4 +91,3 @@
 };
 
 LOGUNIT_TEST_SUITE_REGISTRATION(SocketAppenderTestCase);
-#endif
diff --git a/src/test/cpp/net/telnetappendertestcase.cpp b/src/test/cpp/net/telnetappendertestcase.cpp
index 7482f95..41c8879 100644
--- a/src/test/cpp/net/telnetappendertestcase.cpp
+++ b/src/test/cpp/net/telnetappendertestcase.cpp
@@ -25,7 +25,6 @@
 using namespace log4cxx::helpers;
 using namespace log4cxx::net;
 
-#if APR_HAS_THREADS
 /**
    Unit tests of log4cxx::TelnetAppender
  */
@@ -101,4 +100,3 @@
 };
 
 LOGUNIT_TEST_SUITE_REGISTRATION(TelnetAppenderTestCase);
-#endif
diff --git a/src/test/cpp/net/xmlsocketappendertestcase.cpp b/src/test/cpp/net/xmlsocketappendertestcase.cpp
index 79445be..cfd715b 100644
--- a/src/test/cpp/net/xmlsocketappendertestcase.cpp
+++ b/src/test/cpp/net/xmlsocketappendertestcase.cpp
@@ -23,7 +23,6 @@
 using namespace log4cxx;
 using namespace log4cxx::helpers;
 
-#if APR_HAS_THREADS
 /**
    Unit tests of log4cxx::net::XMLSocketAppender
  */
@@ -60,4 +59,4 @@
 };
 
 LOGUNIT_TEST_SUITE_REGISTRATION(XMLSocketAppenderTestCase);
-#endif
+