PPI: Add missing TargetDgramWriter doku
[senf.git] / Scheduler / FIFORunner.cci
index 5247d5d..5eea900 100644 (file)
 //#include "FIFORunner.ih"
 
 // Custom includes
+#ifdef SENF_DEBUG
+#include <sstream>
+#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 ("<null>") 
 {}
 
-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///////////////////////////////////////