From: g0dil Date: Mon, 30 Aug 2010 13:45:22 +0000 (+0000) Subject: Scheduler: FIFORunner performance enhancements X-Git-Url: http://g0dil.de/git?a=commitdiff_plain;h=79a8a7f0632a27331df5814bec6c8c53470eb8ce;p=senf.git Scheduler: FIFORunner performance enhancements git-svn-id: https://svn.berlios.de/svnroot/repos/senf/trunk@1701 270642c3-0616-0410-b53a-bc976706d245 --- diff --git a/senf/Scheduler/FIFORunner.cc b/senf/Scheduler/FIFORunner.cc index b1aaa6b..783a98d 100644 --- a/senf/Scheduler/FIFORunner.cc +++ b/senf/Scheduler/FIFORunner.cc @@ -29,10 +29,8 @@ // Custom includes #include #include -#include #include #include -#include #ifdef SENF_DEBUG #include #endif @@ -192,31 +190,37 @@ prefix_ void senf::scheduler::detail::FIFORunner::run(TaskList::iterator f, Task TaskList::iterator end (TaskList::current(null)); next_ = f; - using namespace boost::lambda; - ScopeExit atExit (( - var(watchdogCount_) = 0, - var(next_) = l - )); - - while (next_ != end) { - TaskInfo & task (*next_); - if (task.runnable_) { - task.runnable_ = false; - runningName_ = task.name(); -# ifdef SENF_DEBUG - runningBacktrace_ = task.backtrace_; -# endif - TaskList::iterator i (next_); - ++ next_; - tasks_.splice(l, tasks_, i); - watchdogCount_ = 1; - yield_ = false; - task.run(); - if (yield_) - return; + // Would prefer to use ScopeExit+boost::lambda here instead of try but profiling has shown that + // to be to costly here + + try { + while (next_ != end) { + TaskInfo & task (*next_); + if (task.runnable_) { + task.runnable_ = false; + runningName_ = task.name(); + # ifdef SENF_DEBUG + runningBacktrace_ = task.backtrace_; + # endif + TaskList::iterator i (next_); + ++ next_; + tasks_.splice(l, tasks_, i); + watchdogCount_ = 1; + yield_ = false; + task.run(); + if (yield_) + return; + } + else + ++ next_; } - else - ++ next_; + watchdogCount_ = 0; + next_ = 0; + } + catch (...) { + watchdogCount_ = 0; + next_ = 0; + throw; } }