From 211fc562fd502f910a81cee6e366dbf883f7b669 Mon Sep 17 00:00:00 2001
From: g0dil <g0dil@wiback.org>
Date: Sun, 5 Oct 2008 20:24:33 +0000
Subject: [PATCH] Scheduler: Sort 'events' list by priority

---
 Scheduler/EventManager.cc  | 47 +++++++++++++++++++++++---------------
 Scheduler/EventManager.cci |  6 +++--
 Scheduler/EventManager.hh  | 11 +++++----
 Scheduler/FIFORunner.cci   | 26 ++++++++++++++++++++-
 Scheduler/FIFORunner.hh    |  8 +++++++
 Scheduler/SignalEvent.cc   |  2 +-
 Scheduler/TimerEvent.cc    |  2 +-
 7 files changed, 74 insertions(+), 28 deletions(-)

diff --git a/Scheduler/EventManager.cc b/Scheduler/EventManager.cc
index 0743cb69f..fdea03aba 100644
--- a/Scheduler/EventManager.cc
+++ b/Scheduler/EventManager.cc
@@ -46,24 +46,35 @@ prefix_ senf::scheduler::detail::EventManager::EventManager()
 
 prefix_ void senf::scheduler::detail::EventManager::consoleEvents(std::ostream & os)
 {
-    iterator i (begin());
-    iterator const i_end (end());
-    // On an 80 column display, this wraps nicely directly before the RUN column
-    os << boost::format("%-6s %-52s %-10s %-8s %7s %s\n")
-        % "TYPE"
-        % "NAME"
-        % "ADDRESS"
-        % "ACTIVE?"
-        % "RUN"
-        % "INFO";
-    for (; i != i_end; ++i)
-        os << boost::format("%-6.6s %-52.52s 0x%08x %-8.8s %7d %s\n")
-            % i->type()
-            % i->name() 
-            % reinterpret_cast<unsigned long>(&(*i))
-            % (i->enabled() ? "enabled" : "disabled")
-            % i->runCount()
-            % i->info();
+    // On an 80 column display, this wraps nicely directly before the INFO column
+    boost::format fmt  ("%s %-55.55s 0x%08x %8d %s %s\n");
+    os << boost::format("%s %-55.55s %-10s %8s %s %s\n")
+        % "TP" % "NAME" % "ADDRESS" % "RUNCNT" % "S" % "INFO";
+    {
+        FIFORunner::iterator i (FIFORunner::instance().begin());
+        FIFORunner::iterator const i_end (FIFORunner::instance().end());
+        for (; i != i_end; ++i)
+            os << fmt 
+                % i->type()
+                % i->name() 
+                % reinterpret_cast<unsigned long>(&(*i))
+                % i->runCount()
+                % (i->runnable() ? "R" : "W")
+                % i->info();
+    }
+    {
+        iterator i (begin());
+        iterator const i_end (end());
+        for (; i != i_end; ++i)
+            if (! i->enabled())
+                os << fmt
+                    % i->type()
+                    % i->name() 
+                    % reinterpret_cast<unsigned long>(&(*i))
+                    % i->runCount()
+                    % "-"
+                    % i->info();
+    }
 }
 
 ///////////////////////////////cc.e////////////////////////////////////////
diff --git a/Scheduler/EventManager.cci b/Scheduler/EventManager.cci
index 010e8f252..8399ef8e0 100644
--- a/Scheduler/EventManager.cci
+++ b/Scheduler/EventManager.cci
@@ -103,14 +103,16 @@ senf::scheduler::detail::EventManager::begin()
 {
     // We need to filter out elements with e.type() == 0 ... the NullTask temporarily added
     // by the FIFORunner is such an element and must be skipped.
-    return boost::make_filter_iterator(IteratorFilter(), events_.begin(), events_.end());
+    return boost::make_filter_iterator(
+        IteratorFilter(), events_.begin(), events_.end());
 }
 
 prefix_ senf::scheduler::detail::EventManager::iterator
 senf::scheduler::detail::EventManager::end()
     const
 {
-    return boost::make_filter_iterator(IteratorFilter(), events_.end(), events_.end());
+    return boost::make_filter_iterator(
+        IteratorFilter(), events_.end(), events_.end());
 }
 
 ///////////////////////////////cci.e///////////////////////////////////////
diff --git a/Scheduler/EventManager.hh b/Scheduler/EventManager.hh
index 56a32ae41..eff1fabfe 100644
--- a/Scheduler/EventManager.hh
+++ b/Scheduler/EventManager.hh
@@ -88,15 +88,16 @@ namespace detail {
     class EventManager
         : public singleton<EventManager>
     {
-        struct IteratorFilter {
-            bool operator()(Event const & e);
-        };
-
     public:
         using singleton<EventManager>::instance;
         using singleton<EventManager>::alive;
         
-        typedef boost::filter_iterator<IteratorFilter, EventList::const_iterator> iterator;
+        struct IteratorFilter {
+            bool operator()(Event const & e);
+        };
+
+        typedef boost::filter_iterator<
+            IteratorFilter, EventList::const_iterator> iterator;
 
         void add(Event & event);
         void remove(Event & event);
diff --git a/Scheduler/FIFORunner.cci b/Scheduler/FIFORunner.cci
index fb080591e..585bf6e99 100644
--- a/Scheduler/FIFORunner.cci
+++ b/Scheduler/FIFORunner.cci
@@ -48,8 +48,15 @@ prefix_ void senf::scheduler::detail::FIFORunner::TaskInfo::setRunnable()
 
 prefix_ void senf::scheduler::detail::FIFORunner::TaskInfo::run()
 {
-    v_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()
@@ -85,6 +92,23 @@ prefix_ unsigned senf::scheduler::detail::FIFORunner::hangCount()
     return hangCount_;
 }
 
+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
+{
+    return boost::make_filter_iterator(
+        EventManager::IteratorFilter(), tasks_.end(), tasks_.end());
+}
+
 ///////////////////////////////cci.e///////////////////////////////////////
 #undef prefix_
 
diff --git a/Scheduler/FIFORunner.hh b/Scheduler/FIFORunner.hh
index 49d62fa9d..40154d38f 100644
--- a/Scheduler/FIFORunner.hh
+++ b/Scheduler/FIFORunner.hh
@@ -66,6 +66,8 @@ namespace detail {
 
             void run();
 
+            bool runnable() const;
+
         protected:
             void setRunnable();
             
@@ -81,6 +83,9 @@ namespace detail {
             friend class FIFORunner;
         };
 
+        typedef boost::filter_iterator<
+            EventManager::IteratorFilter, TaskList::const_iterator> iterator;
+
         using singleton<FIFORunner>::instance;
         using singleton<FIFORunner>::alive;
 
@@ -94,6 +99,9 @@ namespace detail {
 
         unsigned hangCount() const;
 
+        iterator begin() const;
+        iterator end() const;
+
     protected:
 
     private:
diff --git a/Scheduler/SignalEvent.cc b/Scheduler/SignalEvent.cc
index d66d506e4..a521bd8c6 100644
--- a/Scheduler/SignalEvent.cc
+++ b/Scheduler/SignalEvent.cc
@@ -127,7 +127,7 @@ prefix_ void senf::scheduler::SignalEvent::v_run()
 prefix_ char const * senf::scheduler::SignalEvent::v_type()
     const
 {
-    return "signal";
+    return "si";
 }
 
 prefix_ std::string senf::scheduler::SignalEvent::v_info()
diff --git a/Scheduler/TimerEvent.cc b/Scheduler/TimerEvent.cc
index 572b3c1d7..f3113e4e3 100644
--- a/Scheduler/TimerEvent.cc
+++ b/Scheduler/TimerEvent.cc
@@ -173,7 +173,7 @@ prefix_ void senf::scheduler::TimerEvent::v_run()
 prefix_ char const * senf::scheduler::TimerEvent::v_type()
     const
 {
-    return "timer";
+    return "tm";
 }
 
 prefix_ std::string senf::scheduler::TimerEvent::v_info()
-- 
GitLab