@@ -362,13 +362,17 @@ namespace mamba
362362 void Console::print_buffer (std::ostream& ostream)
363363 {
364364 auto & data = instance ().p_data ;
365- for (auto & message : data->m_buffer )
365+ decltype (data->m_buffer ) tmp;
366+
366367 {
367- ostream << message << ' \n ' ;
368+ const std::lock_guard<std::mutex> lock (data->m_mutex );
369+ data->m_buffer .swap (tmp);
368370 }
369371
370- const std::lock_guard<std::mutex> lock (data->m_mutex );
371- data->m_buffer .clear ();
372+ for (const auto & message : tmp)
373+ {
374+ ostream << message << ' \n ' ;
375+ }
372376 }
373377
374378 // We use an overload instead of a default argument to avoid exposing std::cin
@@ -614,15 +618,19 @@ namespace mamba
614618
615619 void MessageLogger::print_buffer (std::ostream& /* ostream*/ )
616620 {
617- for (auto & [msg, level] : MessageLoggerData::m_buffer)
621+ decltype (MessageLoggerData::m_buffer) tmp;
622+
623+ {
624+ const std::lock_guard<std::mutex> lock (MessageLoggerData::m_mutex);
625+ MessageLoggerData::m_buffer.swap (tmp);
626+ }
627+
628+ for (const auto & [msg, level] : tmp)
618629 {
619630 emit (msg, level);
620631 }
621632
622633 spdlog::apply_all ([&](std::shared_ptr<spdlog::logger> l) { l->flush (); });
623-
624- const std::lock_guard<std::mutex> lock (MessageLoggerData::m_mutex);
625- MessageLoggerData::m_buffer.clear ();
626634 }
627635
628636
0 commit comments