diff --git a/include/spdlog/details/circular_q.h b/include/spdlog/details/circular_q.h index 6f3433a2..cea12174 100644 --- a/include/spdlog/details/circular_q.h +++ b/include/spdlog/details/circular_q.h @@ -31,6 +31,7 @@ public: if (tail_ == head_) // overrun last item if full { head_ = (head_ + 1) % max_items_; + ++overrun_counter_; } } @@ -53,12 +54,19 @@ public: return ((tail_ + 1) % max_items_) == head_; } + int overrun_counter() const + { + return overrun_counter_; + } + private: size_t max_items_; typename std::vector::size_type head_ = 0; typename std::vector::size_type tail_ = 0; std::vector v_; + + int overrun_counter_ = 0; }; } // namespace details } // namespace spdlog diff --git a/include/spdlog/details/mpmc_blocking_q.h b/include/spdlog/details/mpmc_blocking_q.h index d607da2c..3aa9fa1b 100644 --- a/include/spdlog/details/mpmc_blocking_q.h +++ b/include/spdlog/details/mpmc_blocking_q.h @@ -30,6 +30,11 @@ public: { } + int overrun_counter() const + { + return q_.overrun_counter(); + } + #ifndef __MINGW32__ // try to enqueue and block if no room left void enqueue(T &&item) diff --git a/include/spdlog/details/thread_pool.h b/include/spdlog/details/thread_pool.h index b45b6d2b..fd47eed2 100644 --- a/include/spdlog/details/thread_pool.h +++ b/include/spdlog/details/thread_pool.h @@ -157,6 +157,11 @@ public: post_async_msg_(async_msg(std::move(worker_ptr), async_msg_type::flush), overflow_policy); } + int overrun_counter() const + { + return q_.overrun_counter(); + } + private: q_type q_; diff --git a/tests/test_async.cpp b/tests/test_async.cpp index c4324df4..91be8bd9 100644 --- a/tests/test_async.cpp +++ b/tests/test_async.cpp @@ -7,6 +7,7 @@ TEST_CASE("basic async test ", "[async]") { using namespace spdlog; auto test_sink = std::make_shared(); + int overrun_counter = 0; size_t queue_size = 128; size_t messages = 256; { @@ -17,9 +18,11 @@ TEST_CASE("basic async test ", "[async]") logger->info("Hello message #{}", i); } logger->flush(); + overrun_counter = tp->overrun_counter(); } REQUIRE(test_sink->msg_counter() == messages); REQUIRE(test_sink->flush_counter() == 1); + REQUIRE(overrun_counter == 0); } TEST_CASE("discard policy ", "[async]") @@ -37,6 +40,7 @@ TEST_CASE("discard policy ", "[async]") logger->info("Hello message"); } REQUIRE(test_sink->msg_counter() < messages); + REQUIRE(tp->overrun_counter() > 0); } TEST_CASE("discard policy using factory ", "[async]")