diff --git a/include/snowplow/emitter/emitter.cpp b/include/snowplow/emitter/emitter.cpp index b50cd72..55dce2c 100644 --- a/include/snowplow/emitter/emitter.cpp +++ b/include/snowplow/emitter/emitter.cpp @@ -120,6 +120,7 @@ void Emitter::stop() { locker.unlock(); this->m_check_db.notify_all(); + this->m_check_retry.notify_all(); this->m_daemon_thread.join(); } } @@ -188,10 +189,11 @@ void Emitter::run() { m_retry_delay.wont_retry_emit(); } - // sleep for the retry delay if there is one + // sleep for (up to) the retry delay if there is one auto retry_delay = m_retry_delay.get(); if (retry_delay.count() > 0) { - sleep_for(retry_delay); + unique_lock locker(m_retry_select); + m_check_retry.wait_for(locker, retry_delay); } } else { m_check_fin.notify_all(); diff --git a/include/snowplow/emitter/emitter.hpp b/include/snowplow/emitter/emitter.hpp index 06b3144..4d969a1 100644 --- a/include/snowplow/emitter/emitter.hpp +++ b/include/snowplow/emitter/emitter.hpp @@ -188,9 +188,11 @@ class Emitter { thread m_daemon_thread; condition_variable m_check_db; + condition_variable m_check_retry; condition_variable m_check_fin; mutex m_flush_fin; mutex m_db_select; + mutex m_retry_select; mutex m_run_check; bool m_running; EmitterCallback m_callback;