Scheduler: Restructure signal blocking/unblocking
[senf.git] / Scheduler / FIFORunner.cci
index 585bf6e..d363dac 100644 (file)
 #define prefix_ inline
 ///////////////////////////////cci.p///////////////////////////////////////
 
-prefix_ senf::scheduler::detail::FIFORunner::TaskInfo::TaskInfo(std::string const & name)
-    : Event(name), 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()
@@ -65,9 +69,40 @@ prefix_ bool senf::scheduler::detail::FIFORunner::TaskInfo::v_enabled()
     return TaskListBase::linked();
 }
 
+///////////////////////////////////////////////////////////////////////////
+// senf::scheduler::detail::FIFORunner::NullTask
+
+prefix_ senf::scheduler::detail::FIFORunner::NullTask::NullTask()
+    : senf::scheduler::detail::FIFORunner::TaskInfo ("<null>") 
+{}
+
+prefix_ senf::scheduler::detail::FIFORunner::NullTask::~NullTask()
+{
+    if (TaskListBase::linked())
+        FIFORunner::instance().dequeue(this);
+}
+
+prefix_ void senf::scheduler::detail::FIFORunner::NullTask::v_run()
+{}
+
+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_.push_back(*task);
+    tasks_.insert(priorityEnd(task->priority_), *task);
 #ifdef SENF_DEBUG
     std::stringstream ss;
     backtrace(ss, 32);
@@ -78,6 +113,8 @@ prefix_ void senf::scheduler::detail::FIFORunner::enqueue(TaskInfo * task)
 prefix_ void senf::scheduler::detail::FIFORunner::taskTimeout(unsigned ms)
 {
     watchdogMs_ = ms;
+    if (watchdogRunning_)
+        startWatchdog();
 }
 
 prefix_ unsigned senf::scheduler::detail::FIFORunner::taskTimeout()