X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Scheduler%2FFIFORunner.cci;h=5eea9000a777120fa67c06d5607fd4f9e3770a99;hb=81f84badf27b66dbadec9890646ca1193e998505;hp=5247d5d850e20bbe971c6676cf4cf2eb813bf8a1;hpb=919e588a2c387c9a910aa8761e65155a0d205bba;p=senf.git diff --git a/Scheduler/FIFORunner.cci b/Scheduler/FIFORunner.cci index 5247d5d..5eea900 100644 --- a/Scheduler/FIFORunner.cci +++ b/Scheduler/FIFORunner.cci @@ -26,24 +26,136 @@ //#include "FIFORunner.ih" // Custom includes +#ifdef SENF_DEBUG +#include +#include "../Utils/Backtrace.hh" +#endif #define prefix_ inline ///////////////////////////////cci.p/////////////////////////////////////// -prefix_ senf::scheduler::FIFORunner::TaskInfo::TaskInfo() - : runnable (false) +/////////////////////////////////////////////////////////////////////////// +// senf::scheduler::detail::FIFORunner::TaskInfo + +prefix_ senf::scheduler::detail::FIFORunner::TaskInfo::TaskInfo(std::string const & name, + Priority priority) + : Event(name), runnable_ (false), priority_ (priority) +{} + +prefix_ senf::scheduler::detail::FIFORunner::TaskInfo::~TaskInfo() {} -prefix_ senf::scheduler::FIFORunner::TaskInfo::~TaskInfo() +prefix_ void senf::scheduler::detail::FIFORunner::TaskInfo::setRunnable() +{ + runnable_ = true; +} + +prefix_ void senf::scheduler::detail::FIFORunner::TaskInfo::run() +{ + countRun(); + // Be sure to run v_run last since the callback may destroy this instance + v_run(); +} + +prefix_ bool senf::scheduler::detail::FIFORunner::TaskInfo::runnable() + const +{ + return runnable_; +} + +prefix_ bool senf::scheduler::detail::FIFORunner::TaskInfo::v_enabled() + const +{ + return TaskListBase::linked(); +} + +/////////////////////////////////////////////////////////////////////////// +// senf::scheduler::detail::FIFORunner::NullTask + +prefix_ senf::scheduler::detail::FIFORunner::NullTask::NullTask() + : senf::scheduler::detail::FIFORunner::TaskInfo ("") {} -prefix_ senf::scheduler::FIFORunner::FIFORunner() - : tasks_ (), next_ (tasks_.end()) +prefix_ senf::scheduler::detail::FIFORunner::NullTask::~NullTask() +{ + if (TaskListBase::linked()) + FIFORunner::instance().dequeue(this); +} + +prefix_ void senf::scheduler::detail::FIFORunner::NullTask::v_run() {} -prefix_ void senf::scheduler::FIFORunner::enqueue(TaskInfo * task) +prefix_ char const * senf::scheduler::detail::FIFORunner::NullTask::v_type() + const +{ + return 0; +} + +prefix_ std::string senf::scheduler::detail::FIFORunner::NullTask::v_info() + const +{ + return ""; +} + +/////////////////////////////////////////////////////////////////////////// +// senf::scheduler::detail::FIFORunner + +prefix_ void senf::scheduler::detail::FIFORunner::enqueue(TaskInfo * task) +{ + tasks_.insert(priorityEnd(task->priority_), *task); +#ifdef SENF_DEBUG + std::stringstream ss; + backtrace(ss, 32); + task->backtrace_ = ss.str(); +#endif +} + +prefix_ void senf::scheduler::detail::FIFORunner::taskTimeout(unsigned ms) +{ + watchdogMs_ = ms; + if (watchdogRunning_) + startWatchdog(); +} + +prefix_ unsigned senf::scheduler::detail::FIFORunner::taskTimeout() + const +{ + return watchdogMs_; +} + +prefix_ void senf::scheduler::detail::FIFORunner::abortOnTimeout(bool flag) +{ + watchdogAbort_ = flag; +} + +prefix_ bool senf::scheduler::detail::FIFORunner::abortOnTimeout() + const +{ + return watchdogAbort_; +} + +prefix_ unsigned senf::scheduler::detail::FIFORunner::hangCount() +{ + unsigned hc (hangCount_); + hangCount_ = 0; + return hc; +} + +prefix_ senf::scheduler::detail::FIFORunner::iterator +senf::scheduler::detail::FIFORunner::begin() + const +{ + // We need to filter out elements with e.type() == 0 ... the NullTask temporarily added is such + // an element and must be skipped. + return boost::make_filter_iterator( + EventManager::IteratorFilter(), tasks_.begin(), tasks_.end()); +} + +prefix_ senf::scheduler::detail::FIFORunner::iterator senf::scheduler::detail::FIFORunner::end() + const { - tasks_.push_back(*task); + return boost::make_filter_iterator( + EventManager::IteratorFilter(), tasks_.end(), tasks_.end()); } ///////////////////////////////cci.e///////////////////////////////////////