From 8414d96a2a98502973ae7fd8ce47360b285f73a6 Mon Sep 17 00:00:00 2001
From: g0dil <g0dil@wiback.org>
Date: Mon, 6 Nov 2006 11:53:26 +0000
Subject: [PATCH] Restructure internal Scheduler callback representation Add
 missing operators to integer Parsers Fix satcom::pkf::nil to be a valid
 iterator

---
 Packets/ParseInt.ih     |  5 +++++
 Packets/ParserBase.cti  |  2 +-
 Packets/ParserBase.hh   | 15 ++++++++++++++-
 Scheduler/Scheduler.cc  | 14 +++++++-------
 Scheduler/Scheduler.cci |  5 +++++
 Scheduler/Scheduler.cti |  5 +++--
 Scheduler/Scheduler.hh  | 25 ++++++++++++++-----------
 7 files changed, 49 insertions(+), 22 deletions(-)

diff --git a/Packets/ParseInt.ih b/Packets/ParseInt.ih
index 70c5859a5..fd58b04bc 100644
--- a/Packets/ParseInt.ih
+++ b/Packets/ParseInt.ih
@@ -71,6 +71,11 @@ namespace impl {
         Derived const & operator -- ()
             { derived().value( derived.value()-1 ); return derived(); }
 
+        Derived const & operator ++ (int)
+            { Value v (derived.value()); derived().value( v+1 ); return v; }
+        Derived const & operator -- (int)
+            { Value v (derived.value()); derived().value( v-1 ); return v; }
+
     private:
         Derived & derived() { return *static_cast<Derived *>(this); }
         Derived const & derived() const { return *static_cast<Derived const *>(this); };
diff --git a/Packets/ParserBase.cti b/Packets/ParserBase.cti
index 5ba7367e8..084c6253d 100644
--- a/Packets/ParserBase.cti
+++ b/Packets/ParserBase.cti
@@ -22,7 +22,7 @@
 
 // Definition of inline template functions
 
-//#include "ParserBase.ih"
+#include "ParserBase.ih"
 
 // Custom includes
 
diff --git a/Packets/ParserBase.hh b/Packets/ParserBase.hh
index 69508b7cd..cb2eccea7 100644
--- a/Packets/ParserBase.hh
+++ b/Packets/ParserBase.hh
@@ -29,6 +29,7 @@
 
 // Custom includes
 #include <utility>
+#include <boost/iterator/iterator_facade.hpp>
 #include <boost/type_traits/is_member_function_pointer.hpp>
 
 #include "ParserBase.ih"
@@ -39,7 +40,19 @@ namespace pkf {
     
     namespace impl { struct ParserBase; }
 
-    struct nil {};
+    struct nil 
+	: public boost::iterator_facade<nil,char,boost::random_access_traversal_tag>
+    {
+	// Theese are declared to make nil a valid iterator. All
+	// access to an instance of this iterator however is invalid
+	// (these members are not implemented only declared)
+	char & dereference() const;
+	bool equal(nil other) const;
+	void increment();
+	void decrement();
+	void advance(int n);
+	int distance_to(nil other) const;
+    };
 
     /** \brief Parser framework
 
diff --git a/Scheduler/Scheduler.cc b/Scheduler/Scheduler.cc
index 21885f24a..5e8a86083 100644
--- a/Scheduler/Scheduler.cc
+++ b/Scheduler/Scheduler.cc
@@ -90,7 +90,7 @@ prefix_ satcom::lib::Scheduler::Scheduler()
         throw SystemException(errno);
 }
 
-prefix_ void satcom::lib::Scheduler::add(int fd, Callback const & cb, EventId eventMask)
+prefix_ void satcom::lib::Scheduler::do_add(int fd, InternalCallback const & cb, EventId eventMask)
 {
     FdTable::iterator i (fdTable_.find(fd));
     int action (EPOLL_CTL_MOD);
@@ -114,7 +114,7 @@ prefix_ void satcom::lib::Scheduler::add(int fd, Callback const & cb, EventId ev
         throw SystemException(errno);
 }
 
-prefix_ void satcom::lib::Scheduler::remove(int fd, EventId eventMask)
+prefix_ void satcom::lib::Scheduler::do_remove(int fd, EventId eventMask)
 {
     FdTable::iterator i (fdTable_.find(fd));
     if (i == fdTable_.end()) 
@@ -171,24 +171,24 @@ prefix_ void satcom::lib::Scheduler::process()
 
         if (ev.events & EPOLLIN) {
             BOOST_ASSERT(spec.cb_read); 
-            spec.cb_read(ev.data.fd, EV_READ);
+            spec.cb_read(EV_READ);
         }
         else if (ev.events & EPOLLPRI) {
             BOOST_ASSERT(spec.cb_prio);
-            spec.cb_prio (ev.data.fd, EV_PRIO);
+            spec.cb_prio(EV_PRIO);
         }
         else if (ev.events & EPOLLOUT) {
             BOOST_ASSERT(spec.cb_write);
-            spec.cb_write(ev.data.fd, EV_WRITE);
+            spec.cb_write(EV_WRITE);
         }
 
         else if (ev.events & EPOLLHUP) {
             BOOST_ASSERT(spec.cb_hup);
-            spec.cb_hup(ev.data.fd, EV_HUP);
+            spec.cb_hup(EV_HUP);
         }
         else if (ev.events & EPOLLERR) {
             BOOST_ASSERT(spec.cb_err);
-            spec.cb_err(ev.data.fd, EV_ERR);
+            spec.cb_err(EV_ERR);
         }
     }
 }
diff --git a/Scheduler/Scheduler.cci b/Scheduler/Scheduler.cci
index f34286e48..d33265434 100644
--- a/Scheduler/Scheduler.cci
+++ b/Scheduler/Scheduler.cci
@@ -34,6 +34,11 @@ prefix_ void satcom::lib::Scheduler::terminate()
     terminate_ = true;
 }
 
+prefix_ int satcom::lib::retrieve_filehandle(int fd)
+{
+    return fd;
+}
+
 ///////////////////////////////cci.e///////////////////////////////////////
 #undef prefix_
 
diff --git a/Scheduler/Scheduler.cti b/Scheduler/Scheduler.cti
index 7ef1148ba..be4196168 100644
--- a/Scheduler/Scheduler.cti
+++ b/Scheduler/Scheduler.cti
@@ -35,14 +35,15 @@ prefix_ void satcom::lib::Scheduler::add(Handle const & handle,
                                          typename GenericCallback<Handle>::Callback const & cb,
                                          EventId eventMask)
 {
-    add(retrieve_filehandle(handle),boost::bind(cb,handle,_2),eventMask);
+    // retrieve_filehandle is found via ADL
+    do_add(retrieve_filehandle(handle),boost::bind(cb,handle,_1),eventMask);
 }
 
 template <class Handle>
 prefix_ void satcom::lib::Scheduler::remove(Handle const & handle, EventId eventMask)
 {
     // retrieve_filehandle is found via ADL
-    remove(retrieve_filehandle(handle),eventMask);
+    do_remove(retrieve_filehandle(handle),eventMask);
 }
 
 ///////////////////////////////cti.e///////////////////////////////////////
diff --git a/Scheduler/Scheduler.hh b/Scheduler/Scheduler.hh
index e731db4b4..891672318 100644
--- a/Scheduler/Scheduler.hh
+++ b/Scheduler/Scheduler.hh
@@ -59,7 +59,6 @@ namespace lib {
             typedef boost::function<void (typename boost::call_traits<Handle>::param_type,
                                           EventId) > Callback;
         };
-        typedef GenericCallback<int>::Callback Callback;
 
         ///////////////////////////////////////////////////////////////////////////
         ///\name Structors and default members
@@ -76,9 +75,6 @@ namespace lib {
         ///@}
         ///////////////////////////////////////////////////////////////////////////
 
-        void add(int fd, Callback const & cb, EventId eventMask = EV_ALL);
-        void remove(int fd, EventId eventMask = EV_ALL);
-
         template <class Handle>
         void add(Handle const & handle, 
                  typename GenericCallback<Handle>::Callback const & cb,
@@ -94,14 +90,19 @@ namespace lib {
 
     private:
         Scheduler();
-
-        struct EventSpec 
+ 
+	typedef boost::function<void (EventId)> InternalCallback;
+	
+        void do_add(int fd, InternalCallback const & cb, EventId eventMask = EV_ALL);
+        void do_remove(int fd, EventId eventMask = EV_ALL);
+	
+	struct EventSpec 
         {
-            Callback cb_read;
-            Callback cb_prio;
-            Callback cb_write;
-            Callback cb_hup;
-            Callback cb_err;
+            InternalCallback cb_read;
+            InternalCallback cb_prio;
+            InternalCallback cb_write;
+            InternalCallback cb_hup;
+            InternalCallback cb_err;
 
             int epollMask() const;
         };
@@ -113,6 +114,8 @@ namespace lib {
         bool terminate_;
     };
 
+    int retrieve_filehandle(int fd);
+
 }}
 
 ///////////////////////////////hh.e////////////////////////////////////////
-- 
GitLab