From 8d966624051eb492ab725a5dbdd77340bb207d48 Mon Sep 17 00:00:00 2001 From: gabime Date: Sat, 23 Nov 2024 17:21:45 +0200 Subject: [PATCH] More fixes relating to removal of factory and registry and thread pool --- bench/CMakeLists.txt | 4 - bench/async_bench.cpp | 2 +- bench/bench.cpp | 246 ------------------ include/spdlog/async_logger.h | 15 +- include/spdlog/async_overflow_policy.h | 14 + include/spdlog/details/thread_pool-inl.h | 1 + include/spdlog/details/thread_pool.h | 2 +- include/spdlog/sinks/stdout_color_sinks-inl.h | 24 -- include/spdlog/spdlog-inl.h | 4 +- include/spdlog/spdlog.h | 3 - tests/includes.h | 2 - tests/test_backtrace.cpp | 1 - tests/test_custom_callbacks.cpp | 1 - tests/test_time_point.cpp | 1 - 14 files changed, 21 insertions(+), 299 deletions(-) delete mode 100644 bench/bench.cpp create mode 100644 include/spdlog/async_overflow_policy.h diff --git a/bench/CMakeLists.txt b/bench/CMakeLists.txt index 3806b24b..0b91b2d9 100644 --- a/bench/CMakeLists.txt +++ b/bench/CMakeLists.txt @@ -23,10 +23,6 @@ if(NOT benchmark_FOUND) FetchContent_MakeAvailable(googlebenchmark) endif() -add_executable(bench bench.cpp) -spdlog_enable_warnings(bench) -target_link_libraries(bench PRIVATE spdlog::spdlog) - add_executable(async_bench async_bench.cpp) target_link_libraries(async_bench PRIVATE spdlog::spdlog) diff --git a/bench/async_bench.cpp b/bench/async_bench.cpp index dcd24b29..d1305607 100644 --- a/bench/async_bench.cpp +++ b/bench/async_bench.cpp @@ -7,7 +7,7 @@ // bench.cpp : spdlog benchmarks // #include "spdlog/spdlog.h" -#include "spdlog/async.h" +#include "spdlog/async_logger.h" #include "spdlog/sinks/basic_file_sink.h" #if defined(SPDLOG_USE_STD_FORMAT) diff --git a/bench/bench.cpp b/bench/bench.cpp deleted file mode 100644 index ceb0edf2..00000000 --- a/bench/bench.cpp +++ /dev/null @@ -1,246 +0,0 @@ -// -// Copyright(c) 2015 Gabi Melman. -// Distributed under the MIT License (http://opensource.org/licenses/MIT) -// - -// -// bench.cpp : spdlog benchmarks -// -#include "spdlog/spdlog.h" -#include "spdlog/sinks/basic_file_sink.h" -#include "spdlog/sinks/daily_file_sink.h" -#include "spdlog/sinks/null_sink.h" -#include "spdlog/sinks/rotating_file_sink.h" - -#if defined(SPDLOG_USE_STD_FORMAT) - #include -#elif defined(SPDLOG_FMT_EXTERNAL) - #include -#else - #include "spdlog/fmt/bundled/format.h" -#endif - -#include "utils.h" -#include -#include // EXIT_FAILURE -#include -#include -#include - -void bench(int howmany, std::shared_ptr log); -void bench_mt(int howmany, std::shared_ptr log, size_t thread_count); - -// void bench_default_api(int howmany, std::shared_ptr log); -// void bench_c_string(int howmany, std::shared_ptr log); - -static const size_t file_size = 30 * 1024 * 1024; -static const size_t rotating_files = 5; -static const int max_threads = 1000; - -void bench_threaded_logging(size_t threads, int iters) { - spdlog::info("**************************************************************"); - spdlog::info(spdlog::fmt_lib::format( - std::locale("en_US.UTF-8"), "Multi threaded: {:L} threads, {:L} messages", threads, iters)); - spdlog::info("**************************************************************"); - - auto basic_mt = spdlog::basic_logger_mt("basic_mt", "logs/basic_mt.log", true); - bench_mt(iters, std::move(basic_mt), threads); - auto basic_mt_tracing = - spdlog::basic_logger_mt("basic_mt/backtrace-on", "logs/basic_mt.log", true); - basic_mt_tracing->enable_backtrace(32); - bench_mt(iters, std::move(basic_mt_tracing), threads); - - spdlog::info(""); - auto rotating_mt = spdlog::rotating_logger_mt("rotating_mt", "logs/rotating_mt.log", file_size, - rotating_files); - bench_mt(iters, std::move(rotating_mt), threads); - auto rotating_mt_tracing = spdlog::rotating_logger_mt( - "rotating_mt/backtrace-on", "logs/rotating_mt.log", file_size, rotating_files); - rotating_mt_tracing->enable_backtrace(32); - bench_mt(iters, std::move(rotating_mt_tracing), threads); - - spdlog::info(""); - auto daily_mt = spdlog::daily_logger_mt("daily_mt", "logs/daily_mt.log"); - bench_mt(iters, std::move(daily_mt), threads); - auto daily_mt_tracing = spdlog::daily_logger_mt("daily_mt/backtrace-on", "logs/daily_mt.log"); - daily_mt_tracing->enable_backtrace(32); - bench_mt(iters, std::move(daily_mt_tracing), threads); - - spdlog::info(""); - auto empty_logger = std::make_shared("level-off"); - empty_logger->set_level(spdlog::level::off); - bench(iters, empty_logger); - auto empty_logger_tracing = std::make_shared("level-off/backtrace-on"); - empty_logger_tracing->set_level(spdlog::level::off); - empty_logger_tracing->enable_backtrace(32); - bench(iters, empty_logger_tracing); -} - -void bench_single_threaded(int iters) { - spdlog::info("**************************************************************"); - spdlog::info( - spdlog::fmt_lib::format(std::locale("en_US.UTF-8"), "Single threaded: {} messages", iters)); - spdlog::info("**************************************************************"); - - auto basic_st = spdlog::basic_logger_st("basic_st", "logs/basic_st.log", true); - bench(iters, std::move(basic_st)); - - auto basic_st_tracing = - spdlog::basic_logger_st("basic_st/backtrace-on", "logs/basic_st.log", true); - bench(iters, std::move(basic_st_tracing)); - - spdlog::info(""); - auto rotating_st = spdlog::rotating_logger_st("rotating_st", "logs/rotating_st.log", file_size, - rotating_files); - bench(iters, std::move(rotating_st)); - auto rotating_st_tracing = spdlog::rotating_logger_st( - "rotating_st/backtrace-on", "logs/rotating_st.log", file_size, rotating_files); - rotating_st_tracing->enable_backtrace(32); - bench(iters, std::move(rotating_st_tracing)); - - spdlog::info(""); - auto daily_st = spdlog::daily_logger_st("daily_st", "logs/daily_st.log"); - bench(iters, std::move(daily_st)); - auto daily_st_tracing = spdlog::daily_logger_st("daily_st/backtrace-on", "logs/daily_st.log"); - daily_st_tracing->enable_backtrace(32); - bench(iters, std::move(daily_st_tracing)); - - spdlog::info(""); - auto empty_logger = std::make_shared("level-off"); - empty_logger->set_level(spdlog::level::off); - bench(iters, empty_logger); - - auto empty_logger_tracing = std::make_shared("level-off/backtrace-on"); - empty_logger_tracing->set_level(spdlog::level::off); - empty_logger_tracing->enable_backtrace(32); - bench(iters, empty_logger_tracing); -} - -int main(int argc, char *argv[]) { - spdlog::set_automatic_registration(false); - spdlog::default_logger()->set_pattern("[%^%l%$] %v"); - int iters = 250000; - size_t threads = 4; - try { - if (argc > 1) { - iters = std::stoi(argv[1]); - } - if (argc > 2) { - threads = std::stoul(argv[2]); - } - - if (threads > max_threads) { - throw std::runtime_error( - spdlog::fmt_lib::format("Number of threads exceeds maximum({})", max_threads)); - } - - bench_single_threaded(iters); - bench_threaded_logging(1, iters); - bench_threaded_logging(threads, iters); - } catch (std::exception &ex) { - spdlog::error(ex.what()); - return EXIT_FAILURE; - } - return EXIT_SUCCESS; -} - -void bench(int howmany, std::shared_ptr log) { - using std::chrono::duration; - using std::chrono::duration_cast; - using std::chrono::high_resolution_clock; - - auto start = high_resolution_clock::now(); - for (auto i = 0; i < howmany; ++i) { - log->info("Hello logger: msg number {}", i); - } - - auto delta = high_resolution_clock::now() - start; - auto delta_d = duration_cast>(delta).count(); - - spdlog::info(spdlog::fmt_lib::format(std::locale("en_US.UTF-8"), - "{:<30} Elapsed: {:0.2f} secs {:>16L}/sec", log->name(), - delta_d, size_t(howmany / delta_d))); - spdlog::drop(log->name()); -} - -void bench_mt(int howmany, std::shared_ptr log, size_t thread_count) { - using std::chrono::duration; - using std::chrono::duration_cast; - using std::chrono::high_resolution_clock; - - std::vector threads; - threads.reserve(thread_count); - auto start = high_resolution_clock::now(); - for (size_t t = 0; t < thread_count; ++t) { - threads.emplace_back([&]() { - for (int j = 0; j < howmany / static_cast(thread_count); j++) { - log->info("Hello logger: msg number {}", j); - } - }); - } - - for (auto &t : threads) { - t.join(); - } - - auto delta = high_resolution_clock::now() - start; - auto delta_d = duration_cast>(delta).count(); - spdlog::info(spdlog::fmt_lib::format(std::locale("en_US.UTF-8"), - "{:<30} Elapsed: {:0.2f} secs {:>16L}/sec", log->name(), - delta_d, size_t(howmany / delta_d))); - spdlog::drop(log->name()); -} - -/* -void bench_default_api(int howmany, std::shared_ptr log) -{ - using std::chrono::high_resolution_clock; - using std::chrono::duration; - using std::chrono::duration_cast; - - auto orig_default = spdlog::default_logger(); - spdlog::set_default_logger(log); - auto start = high_resolution_clock::now(); - for (auto i = 0; i < howmany; ++i) - { - spdlog::info("Hello logger: msg number {}", i); - } - - auto delta = high_resolution_clock::now() - start; - auto delta_d = duration_cast>(delta).count(); - spdlog::drop(log->name()); - spdlog::set_default_logger(std::move(orig_default)); - spdlog::info("{:<30} Elapsed: {:0.2f} secs {:>16}/sec", log->name(), delta_d, int(howmany / -delta_d)); -} - -void bench_c_string(int howmany, std::shared_ptr log) -{ - using std::chrono::high_resolution_clock; - using std::chrono::duration; - using std::chrono::duration_cast; - - const char *msg = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum pharetra -metus cursus " "lacus placerat congue. Nulla egestas, mauris a tincidunt tempus, enim lectus -volutpat mi, eu consequat sem " "libero nec massa. In dapibus ipsum a diam rhoncus gravida. Etiam -non dapibus eros. Donec fringilla dui sed " "augue pretium, nec scelerisque est maximus. Nullam -convallis, sem nec blandit maximus, nisi turpis ornare " "nisl, sit amet volutpat neque massa eu -odio. Maecenas malesuada quam ex, posuere congue nibh turpis duis."; - - auto orig_default = spdlog::default_logger(); - spdlog::set_default_logger(log); - auto start = high_resolution_clock::now(); - for (auto i = 0; i < howmany; ++i) - { - spdlog::log(spdlog::level::info, msg); - } - - auto delta = high_resolution_clock::now() - start; - auto delta_d = duration_cast>(delta).count(); - spdlog::drop(log->name()); - spdlog::set_default_logger(std::move(orig_default)); - spdlog::info("{:<30} Elapsed: {:0.2f} secs {:>16}/sec", log->name(), delta_d, int(howmany / -delta_d)); -} - -*/ diff --git a/include/spdlog/async_logger.h b/include/spdlog/async_logger.h index 9982eeab..c0840357 100644 --- a/include/spdlog/async_logger.h +++ b/include/spdlog/async_logger.h @@ -15,22 +15,11 @@ // destructing.. #include -#include +#include "spdlog/async_overflow_policy.h" +#include "spdlog/details/thread_pool.h" namespace spdlog { -// Async overflow policy - block by default. -enum class async_overflow_policy { - block, // Block until message can be enqueued - overrun_oldest, // Discard oldest message in the queue if full when trying to - // add new item. - discard_new // Discard new message if the queue is full when trying to add new item. -}; - -namespace details { -class thread_pool; -} - class SPDLOG_API async_logger final : public std::enable_shared_from_this, public logger { friend class details::thread_pool; diff --git a/include/spdlog/async_overflow_policy.h b/include/spdlog/async_overflow_policy.h new file mode 100644 index 00000000..124f9e5e --- /dev/null +++ b/include/spdlog/async_overflow_policy.h @@ -0,0 +1,14 @@ +#pragma once + +namespace spdlog { +// Async overflow policy - block by default. +enum class async_overflow_policy { + block, // Block until message can be enqueued + overrun_oldest, // Discard oldest message in the queue if full when trying to + // add new item. + discard_new // Discard new message if the queue is full when trying to add new item. +}; + +} + + diff --git a/include/spdlog/details/thread_pool-inl.h b/include/spdlog/details/thread_pool-inl.h index 17e01c09..da68c574 100644 --- a/include/spdlog/details/thread_pool-inl.h +++ b/include/spdlog/details/thread_pool-inl.h @@ -9,6 +9,7 @@ #include #include +#include "spdlog/async_logger.h" namespace spdlog { namespace details { diff --git a/include/spdlog/details/thread_pool.h b/include/spdlog/details/thread_pool.h index 401c8348..b0646223 100644 --- a/include/spdlog/details/thread_pool.h +++ b/include/spdlog/details/thread_pool.h @@ -6,6 +6,7 @@ #include #include #include +#include #include #include @@ -15,7 +16,6 @@ namespace spdlog { class async_logger; -enum class async_overflow_policy; namespace details { using async_logger_ptr = std::shared_ptr; diff --git a/include/spdlog/sinks/stdout_color_sinks-inl.h b/include/spdlog/sinks/stdout_color_sinks-inl.h index 166e3861..80084a1b 100644 --- a/include/spdlog/sinks/stdout_color_sinks-inl.h +++ b/include/spdlog/sinks/stdout_color_sinks-inl.h @@ -11,28 +11,4 @@ #include namespace spdlog { - -template -SPDLOG_INLINE std::shared_ptr stdout_color_mt(const std::string &logger_name, - color_mode mode) { - return Factory::template create(logger_name, mode); -} - -template -SPDLOG_INLINE std::shared_ptr stdout_color_st(const std::string &logger_name, - color_mode mode) { - return Factory::template create(logger_name, mode); -} - -template -SPDLOG_INLINE std::shared_ptr stderr_color_mt(const std::string &logger_name, - color_mode mode) { - return Factory::template create(logger_name, mode); -} - -template -SPDLOG_INLINE std::shared_ptr stderr_color_st(const std::string &logger_name, - color_mode mode) { - return Factory::template create(logger_name, mode); -} } // namespace spdlog diff --git a/include/spdlog/spdlog-inl.h b/include/spdlog/spdlog-inl.h index bd11dc3c..1d69407b 100644 --- a/include/spdlog/spdlog-inl.h +++ b/include/spdlog/spdlog-inl.h @@ -9,7 +9,7 @@ #include #include -#include +#include namespace spdlog { @@ -19,7 +19,7 @@ using default_sink_t = sinks::stdout_color_sink_mt; using default_sink_t = sinks::null_sink_mt; #endif -SPDLOG_INLINE static auto s_logger = std::make_shared("", std::make_shared()); +static auto s_logger = std::make_shared("", std::make_shared()); SPDLOG_INLINE void set_formatter(std::unique_ptr formatter) { s_logger->set_formatter(std::move(formatter)); diff --git a/include/spdlog/spdlog.h b/include/spdlog/spdlog.h index 37133660..9d7e68bd 100644 --- a/include/spdlog/spdlog.h +++ b/include/spdlog/spdlog.h @@ -12,9 +12,6 @@ #include #include #include - -#include -#include #include #include diff --git a/tests/includes.h b/tests/includes.h index 0e980a54..32093c5b 100644 --- a/tests/includes.h +++ b/tests/includes.h @@ -19,12 +19,10 @@ #include #include #include -#include #define SPDLOG_ACTIVE_LEVEL SPDLOG_LEVEL_DEBUG #include "spdlog/spdlog.h" -#include "spdlog/async.h" #include "spdlog/details/fmt_helper.h" #include "spdlog/details/os.h" #include "spdlog/sinks/basic_file_sink.h" diff --git a/tests/test_backtrace.cpp b/tests/test_backtrace.cpp index 393ddafd..b9de68e0 100644 --- a/tests/test_backtrace.cpp +++ b/tests/test_backtrace.cpp @@ -1,6 +1,5 @@ #include "includes.h" #include "test_sink.h" -#include "spdlog/async.h" #include "spdlog/async_logger.h" TEST_CASE("bactrace1", "[bactrace]") { diff --git a/tests/test_custom_callbacks.cpp b/tests/test_custom_callbacks.cpp index 8d275de6..94c6768a 100644 --- a/tests/test_custom_callbacks.cpp +++ b/tests/test_custom_callbacks.cpp @@ -5,7 +5,6 @@ #include "includes.h" #include "test_sink.h" #include "spdlog/sinks/callback_sink.h" -#include "spdlog/async.h" #include "spdlog/common.h" TEST_CASE("custom_callback_logger", "[custom_callback_logger]") { diff --git a/tests/test_time_point.cpp b/tests/test_time_point.cpp index 813d771a..8b5791af 100644 --- a/tests/test_time_point.cpp +++ b/tests/test_time_point.cpp @@ -1,6 +1,5 @@ #include "includes.h" #include "test_sink.h" -#include "spdlog/async.h" TEST_CASE("time_point1", "[time_point log_msg]") { std::shared_ptr test_sink(new spdlog::sinks::test_sink_st);