diff --git a/bench/adapters/SpdlogAdapter.cpp b/bench/adapters/SpdlogAdapter.cpp index 9e5393c..e1ab0f3 100644 --- a/bench/adapters/SpdlogAdapter.cpp +++ b/bench/adapters/SpdlogAdapter.cpp @@ -3,6 +3,8 @@ #ifdef LOGIT_BENCH_HAVE_SPDLOG #include +#include +#include #include #include #include @@ -38,6 +40,7 @@ class SpdlogAdapter::MeasuringSink : public spdlog::sinks::sink { std::lock_guard lock(m_pending_mx); m_pending.clear(); m_retired.clear(); + m_pending_count = 0; } if (m_sink == SinkKind::File) { std::filesystem::create_directories("bench/results"); @@ -53,6 +56,7 @@ class SpdlogAdapter::MeasuringSink : public spdlog::sinks::sink { void track_token(const LatencyRecorder::Token& token, std::unique_ptr payload) { std::lock_guard lock(m_pending_mx); m_pending.push_back(Pending{std::move(payload), token}); + ++m_pending_count; } void log(const spdlog::details::log_msg& msg) override { @@ -80,8 +84,10 @@ class SpdlogAdapter::MeasuringSink : public spdlog::sinks::sink { void complete_pending() { std::vector pending; { - std::lock_guard lock(m_pending_mx); + std::unique_lock lock(m_pending_mx); + m_pending_cv.wait_for(lock, std::chrono::milliseconds(100), [&]{ return m_pending_count == 0; }); pending.swap(m_pending); + m_pending_count = 0; } std::vector> retired; @@ -110,6 +116,8 @@ class SpdlogAdapter::MeasuringSink : public spdlog::sinks::sink { token = it->token; owned = std::move(it->payload); m_pending.erase(it); + --m_pending_count; + if (m_pending_count == 0) m_pending_cv.notify_all(); } } @@ -118,6 +126,10 @@ class SpdlogAdapter::MeasuringSink : public spdlog::sinks::sink { if (token.active && m_recorder) { m_recorder->complete(token); } + if (owned) { + std::lock_guard lock(m_pending_mx); + m_retired.push_back(std::move(owned)); + } if (m_sink == SinkKind::File) { std::lock_guard lock(m_mutex); if (m_file.is_open()) { @@ -136,7 +148,8 @@ class SpdlogAdapter::MeasuringSink : public spdlog::sinks::sink { }; std::vector m_pending; std::vector> m_retired; - + std::size_t m_pending_count = 0; + std::condition_variable m_pending_cv; std::mutex m_pending_mx; };