From 0f9acdffbb7b3e52d9c4f4448d4ad3b8fdf9e4f4 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Fri, 15 Mar 2013 09:10:06 +0100 Subject: [PATCH] Fix: Only take one work item from the event queue per iteration. --- lib/base/eventqueue.cpp | 69 ++++++++++++++++++++--------------------- lib/base/eventqueue.h | 2 +- lib/base/i2-base.h | 2 ++ 3 files changed, 37 insertions(+), 36 deletions(-) diff --git a/lib/base/eventqueue.cpp b/lib/base/eventqueue.cpp index ba58ad001..e25f8d023 100644 --- a/lib/base/eventqueue.cpp +++ b/lib/base/eventqueue.cpp @@ -78,7 +78,7 @@ void EventQueue::Join(void) void EventQueue::QueueThreadProc(void) { for (;;) { - vector events; + Callback event; { boost::mutex::scoped_lock lock(m_Mutex); @@ -89,63 +89,62 @@ void EventQueue::QueueThreadProc(void) if (m_Events.empty() && m_Stopped) break; - events.swap(m_Events); + event = m_Events.top(); + m_Events.pop(); } - BOOST_FOREACH(const Callback& ev, events) { #ifdef _DEBUG - double st = Utility::GetTime(); + double st = Utility::GetTime(); # ifdef RUSAGE_THREAD - struct rusage usage_start, usage_end; + struct rusage usage_start, usage_end; - (void) getrusage(RUSAGE_THREAD, &usage_start); + (void) getrusage(RUSAGE_THREAD, &usage_start); # endif /* RUSAGE_THREAD */ #endif /* _DEBUG */ - try { - ev(); - } catch (const std::exception& ex) { - stringstream msgbuf; - msgbuf << "Exception thrown in event handler: " << std::endl - << diagnostic_information(ex); + try { + event(); + } catch (const std::exception& ex) { + stringstream msgbuf; + msgbuf << "Exception thrown in event handler: " << std::endl + << diagnostic_information(ex); - Logger::Write(LogCritical, "base", msgbuf.str()); - } catch (...) { - Logger::Write(LogCritical, "base", "Exception of unknown type thrown in event handler."); - } + Logger::Write(LogCritical, "base", msgbuf.str()); + } catch (...) { + Logger::Write(LogCritical, "base", "Exception of unknown type thrown in event handler."); + } #ifdef _DEBUG - double et = Utility::GetTime(); + double et = Utility::GetTime(); # ifdef RUSAGE_THREAD - (void) getrusage(RUSAGE_THREAD, &usage_end); + (void) getrusage(RUSAGE_THREAD, &usage_end); - double duser = (usage_end.ru_utime.tv_sec - usage_start.ru_utime.tv_sec) + - (usage_end.ru_utime.tv_usec - usage_start.ru_utime.tv_usec) / 1000000.0; + double duser = (usage_end.ru_utime.tv_sec - usage_start.ru_utime.tv_sec) + + (usage_end.ru_utime.tv_usec - usage_start.ru_utime.tv_usec) / 1000000.0; - double dsys = (usage_end.ru_stime.tv_sec - usage_start.ru_stime.tv_sec) + - (usage_end.ru_stime.tv_usec - usage_start.ru_stime.tv_usec) / 1000000.0; + double dsys = (usage_end.ru_stime.tv_sec - usage_start.ru_stime.tv_sec) + + (usage_end.ru_stime.tv_usec - usage_start.ru_stime.tv_usec) / 1000000.0; - double dwait = (et - st) - (duser + dsys); + double dwait = (et - st) - (duser + dsys); - int dminfaults = usage_end.ru_minflt - usage_start.ru_minflt; - int dmajfaults = usage_end.ru_majflt - usage_start.ru_majflt; + int dminfaults = usage_end.ru_minflt - usage_start.ru_minflt; + int dmajfaults = usage_end.ru_majflt - usage_start.ru_majflt; - int dvctx = usage_end.ru_nvcsw - usage_start.ru_nvcsw; - int divctx = usage_end.ru_nivcsw - usage_start.ru_nivcsw; + int dvctx = usage_end.ru_nvcsw - usage_start.ru_nvcsw; + int divctx = usage_end.ru_nivcsw - usage_start.ru_nivcsw; # endif /* RUSAGE_THREAD */ - if (et - st > 0.5) { - stringstream msgbuf; + if (et - st > 0.5) { + stringstream msgbuf; # ifdef RUSAGE_THREAD - msgbuf << "Event call took user:" << duser << "s, system:" << dsys << "s, wait:" << dwait << "s, minor_faults:" << dminfaults << ", major_faults:" << dmajfaults << ", voluntary_csw:" << dvctx << ", involuntary_csw:" << divctx; + msgbuf << "Event call took user:" << duser << "s, system:" << dsys << "s, wait:" << dwait << "s, minor_faults:" << dminfaults << ", major_faults:" << dmajfaults << ", voluntary_csw:" << dvctx << ", involuntary_csw:" << divctx; # else - msgbuf << "Event call took " << (et - st) << "s"; + msgbuf << "Event call took " << (et - st) << "s"; # endif /* RUSAGE_THREAD */ - Logger::Write(LogWarning, "base", msgbuf.str()); - } -#endif /* _DEBUG */ + Logger::Write(LogWarning, "base", msgbuf.str()); } +#endif /* _DEBUG */ } } @@ -158,7 +157,7 @@ void EventQueue::QueueThreadProc(void) void EventQueue::Post(const EventQueue::Callback& callback) { boost::mutex::scoped_lock lock(m_Mutex); - m_Events.push_back(callback); + m_Events.push(callback); m_CV.notify_one(); } diff --git a/lib/base/eventqueue.h b/lib/base/eventqueue.h index 0a383f5ac..141e4c381 100644 --- a/lib/base/eventqueue.h +++ b/lib/base/eventqueue.h @@ -50,7 +50,7 @@ private: condition_variable m_CV; bool m_Stopped; - vector m_Events; + stack m_Events; void QueueThreadProc(void); void ReportThreadProc(void); diff --git a/lib/base/i2-base.h b/lib/base/i2-base.h index 2e7546dd7..fb59d848e 100644 --- a/lib/base/i2-base.h +++ b/lib/base/i2-base.h @@ -91,6 +91,7 @@ #include #include #include +#include #include using std::vector; @@ -101,6 +102,7 @@ using std::multimap; using std::multiset; using std::pair; using std::deque; +using std::stack; using std::make_pair; using std::stringstream; -- 2.40.0