diff --git a/src/main/cpp/aprinitializer.cpp b/src/main/cpp/aprinitializer.cpp index 454b77184..f04e0aa22 100644 --- a/src/main/cpp/aprinitializer.cpp +++ b/src/main/cpp/aprinitializer.cpp @@ -96,7 +96,6 @@ APRInitializer::APRInitializer() : APRInitializer::~APRInitializer() { - stopWatchDogs(); isDestructed = true; #if APR_HAS_THREADS std::lock_guard lock(m_priv->mutex); diff --git a/src/main/cpp/threadutility.cpp b/src/main/cpp/threadutility.cpp index 72056cad9..823eb8d0c 100644 --- a/src/main/cpp/threadutility.cpp +++ b/src/main/cpp/threadutility.cpp @@ -37,6 +37,10 @@ #if LOG4CXX_EVENTS_AT_EXIT #include #endif +#if !defined(LOG4CXX) + #define LOG4CXX 1 +#endif +#include namespace LOG4CXX_NS { @@ -117,8 +121,12 @@ ThreadUtility::~ThreadUtility() {} ThreadUtility* ThreadUtility::instance() { - static WideLife instance; - return &instance.value(); + using ThreadUtilityHolder = SingletonHolder; + auto result = APRInitializer::getOrAddUnique + ( []() -> ObjectPtr + { return std::make_shared(); } + ); + return &result->value(); } void ThreadUtility::configure( ThreadConfigurationType type ) diff --git a/src/main/include/log4cxx/helpers/filewatchdog.h b/src/main/include/log4cxx/helpers/filewatchdog.h index a3f5a1dd6..dd499485e 100644 --- a/src/main/include/log4cxx/helpers/filewatchdog.h +++ b/src/main/include/log4cxx/helpers/filewatchdog.h @@ -22,9 +22,6 @@ #include #include #include -#include -#include -#include namespace LOG4CXX_NS { diff --git a/src/main/include/log4cxx/helpers/singletonholder.h b/src/main/include/log4cxx/helpers/singletonholder.h new file mode 100644 index 000000000..85783e0d0 --- /dev/null +++ b/src/main/include/log4cxx/helpers/singletonholder.h @@ -0,0 +1,52 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef LOG4CXX_SINGLETON_HOLDER_H +#define LOG4CXX_SINGLETON_HOLDER_H + +#include + +namespace LOG4CXX_NS +{ +namespace helpers +{ + +/** Wraps any singleton object so it can be added to APRInitializer + */ +template +class SingletonHolder : public Object +{ + using ThisType = SingletonHolder; + T m_data; + struct Unused : public helpers::Class + { + LogString getName() const override { return LOG4CXX_STR("SingletonHolder"); } + }; +public: // Object method stubs + const helpers::Class& getClass() const override { static Unused notUsed; return notUsed; } + BEGIN_LOG4CXX_CAST_MAP() + LOG4CXX_CAST_ENTRY(ThisType) + END_LOG4CXX_CAST_MAP() + +public: // Accessors + T& value() { return m_data; } +}; + +} // namespace helpers +} // namespace LOG4CXX_NS + +#endif //LOG4CXX_SINGLETON_HOLDER_H diff --git a/src/main/include/log4cxx/helpers/threadutility.h b/src/main/include/log4cxx/helpers/threadutility.h index 353bc3011..6fe738e64 100644 --- a/src/main/include/log4cxx/helpers/threadutility.h +++ b/src/main/include/log4cxx/helpers/threadutility.h @@ -24,7 +24,7 @@ #include #include "log4cxx/logstring.h" -#include "widelife.h" +#include "singletonholder.h" namespace LOG4CXX_NS { @@ -72,6 +72,7 @@ class LOG4CXX_EXPORT ThreadUtility { private: friend class LOG4CXX_NS::helpers::WideLife; + friend class LOG4CXX_NS::helpers::SingletonHolder; ThreadUtility(); LOG4CXX_NS::helpers::ThreadStartPre preStartFunction();