diff --git a/lib/include/srslte/common/logmap.h b/lib/include/srslte/common/logmap.h index 2537a5171..7aaa6d2b3 100644 --- a/lib/include/srslte/common/logmap.h +++ b/lib/include/srslte/common/logmap.h @@ -20,6 +20,7 @@ */ #include "logger.h" +#include "singleton.h" #include #include @@ -30,10 +31,11 @@ namespace srslte { class log_filter; -class logmap +class logmap : public singleton_t { public: // Access to log map by servicename. If servicename does not exist, create a new log_filter with default cfg + // Access to the map is protected by a mutex static log* get(const std::string& servicename) { logmap* pool = get_instance(); @@ -51,12 +53,6 @@ public: return it->second.get(); } - static logmap* get_instance() - { - static logmap* instance = new logmap{}; - return instance; - } - // set default logger void set_default_logger(logger* logger_) { @@ -91,9 +87,10 @@ public: return log_map.erase(servicename) > 0; } -private: +protected: logmap() : default_logger(&logger_stdout_val) {} +private: // consts logger_stdout logger_stdout_val; diff --git a/lib/include/srslte/common/singleton.h b/lib/include/srslte/common/singleton.h new file mode 100644 index 000000000..5a3fdd2dd --- /dev/null +++ b/lib/include/srslte/common/singleton.h @@ -0,0 +1,53 @@ +/* + * Copyright 2013-2019 Software Radio Systems Limited + * + * This file is part of srsLTE. + * + * srsLTE is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. + * + * srsLTE is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * A copy of the GNU Affero General Public License can be found in + * the LICENSE file in the top-level directory of this distribution + * and at http://www.gnu.org/licenses/. + * + */ + +#ifndef SRSLTE_SINGLETON_H +#define SRSLTE_SINGLETON_H + +// CRTP pattern to create class singletons +template +class singleton_t +{ +public: + singleton_t(const singleton_t&) = delete; + singleton_t(singleton_t&&) = delete; + singleton_t& operator=(const singleton_t&) = delete; + singleton_t& operator=(singleton_t&&) = delete; + + static T* get_instance() + { + // this variable initialization is thread-safe since C++11 + // instance dtor is called on program exit + static std::unique_ptr instance{new T_instance{}}; + return instance.get(); + } + +protected: + singleton_t() = default; + +private: + // this class makes the protected T::T() accessible to the singleton + struct T_instance : public T { + T_instance() : T() {} + }; +}; + +#endif // SRSLTE_SINGLETON_H