PPI: Remove specializations from documentation
g0dil [Wed, 22 Aug 2007 09:13:50 +0000 (09:13 +0000)]
PPI: More documentation
PPI: Implement IdleEvent and ActiveFeeder
PPI: add Module::running() member
Scheduler: Remove MinTimeout (not needed with ClockService working)

git-svn-id: https://svn.berlios.de/svnroot/repos/senf/trunk@405 270642c3-0616-0410-b53a-bc976706d245

29 files changed:
PPI/ActiveFeeder.cc [new file with mode: 0644]
PPI/ActiveFeeder.cci [new file with mode: 0644]
PPI/ActiveFeeder.hh [new file with mode: 0644]
PPI/ActiveFeeder.test.cc [new file with mode: 0644]
PPI/Connectors.hh
PPI/DebugModules.hh
PPI/DebugModules.test.cc
PPI/Events.hh
PPI/Events.ih
PPI/IdleEvent.cc [new file with mode: 0644]
PPI/IdleEvent.cci [new file with mode: 0644]
PPI/IdleEvent.hh [new file with mode: 0644]
PPI/IntervalTimer.cc
PPI/IntervalTimer.hh
PPI/Joins.cti
PPI/Joins.hh
PPI/Module.hh
PPI/ModuleManager.cc
PPI/ModuleManager.cci
PPI/ModuleManager.hh
PPI/Route.ih
PPI/Setup.cci
PPI/Setup.cti
PPI/detail/Callback.hh
PPI/detail/EventBinding.hh
Scheduler/ClockService.hh
Scheduler/Scheduler.cc
Scheduler/Scheduler.cci
Scheduler/Scheduler.hh

diff --git a/PPI/ActiveFeeder.cc b/PPI/ActiveFeeder.cc
new file mode 100644 (file)
index 0000000..c7029c2
--- /dev/null
@@ -0,0 +1,59 @@
+// $Id$
+//
+// Copyright (C) 2007 
+// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
+// Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
+//     Stefan Bund <g0dil@berlios.de>
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the
+// Free Software Foundation, Inc.,
+// 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+/** \file
+    \brief ActiveFeeder non-inline non-template implementation */
+
+#include "ActiveFeeder.hh"
+//#include "ActiveFeeder.ih"
+
+// Custom includes
+
+//#include "ActiveFeeder.mpp"
+#define prefix_
+///////////////////////////////cc.p////////////////////////////////////////
+
+///////////////////////////////////////////////////////////////////////////
+// senf::ppi::module::ActiveFeeder
+
+////////////////////////////////////////
+// private members
+
+prefix_ void senf::ppi::module::ActiveFeeder::request()
+{
+    output(input());
+}
+
+///////////////////////////////cc.e////////////////////////////////////////
+#undef prefix_
+//#include "ActiveFeeder.mpp"
+
+\f
+// Local Variables:
+// mode: c++
+// fill-column: 100
+// comment-column: 40
+// c-file-style: "senf"
+// indent-tabs-mode: nil
+// ispell-local-dictionary: "american"
+// compile-command: "scons -u test"
+// End:
diff --git a/PPI/ActiveFeeder.cci b/PPI/ActiveFeeder.cci
new file mode 100644 (file)
index 0000000..2125db5
--- /dev/null
@@ -0,0 +1,53 @@
+// $Id$
+//
+// Copyright (C) 2007 
+// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
+// Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
+//     Stefan Bund <g0dil@berlios.de>
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the
+// Free Software Foundation, Inc.,
+// 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+/** \file
+    \brief ActiveFeeder inline non-template implementation */
+
+// Custom includes
+
+#define prefix_ inline
+///////////////////////////////cci.p///////////////////////////////////////
+
+///////////////////////////////////////////////////////////////////////////
+// senf::ppi::module::ActiveFeeder
+
+prefix_ senf::ppi::module::ActiveFeeder::ActiveFeeder()
+{
+    route(input,idle_);
+    route(idle_,output);
+    registerEvent(& ActiveFeeder::request, idle_);
+}
+
+///////////////////////////////cci.e///////////////////////////////////////
+#undef prefix_
+
+\f
+// Local Variables:
+// mode: c++
+// fill-column: 100
+// comment-column: 40
+// c-file-style: "senf"
+// indent-tabs-mode: nil
+// ispell-local-dictionary: "american"
+// compile-command: "scons -u test"
+// End:
diff --git a/PPI/ActiveFeeder.hh b/PPI/ActiveFeeder.hh
new file mode 100644 (file)
index 0000000..a545050
--- /dev/null
@@ -0,0 +1,74 @@
+// $Id$
+//
+// Copyright (C) 2007 
+// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
+// Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
+//     Stefan Bund <g0dil@berlios.de>
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the
+// Free Software Foundation, Inc.,
+// 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+/** \file
+    \brief ActiveFeeder public header */
+
+#ifndef HH_ActiveFeeder_
+#define HH_ActiveFeeder_ 1
+
+// Custom includes
+#include "Module.hh"
+#include "Connectors.hh"
+#include "IdleEvent.hh"
+
+//#include "ActiveFeeder.mpp"
+///////////////////////////////hh.p////////////////////////////////////////
+
+namespace senf {
+namespace ppi {
+namespace module {
+
+    class ActiveFeeder
+        : public Module
+    {
+        SENF_PPI_MODULE(ActiveFeeder);
+    public:
+        connector::ActiveInput input;
+        connector::ActiveOutput output;
+
+        ActiveFeeder();
+
+    private:
+        void request();
+
+        IdleEvent idle_;
+    };
+
+}}}
+
+///////////////////////////////hh.e////////////////////////////////////////
+#include "ActiveFeeder.cci"
+//#include "ActiveFeeder.ct"
+//#include "ActiveFeeder.cti"
+#endif
+
+\f
+// Local Variables:
+// mode: c++
+// fill-column: 100
+// comment-column: 40
+// c-file-style: "senf"
+// indent-tabs-mode: nil
+// ispell-local-dictionary: "american"
+// compile-command: "scons -u test"
+// End:
diff --git a/PPI/ActiveFeeder.test.cc b/PPI/ActiveFeeder.test.cc
new file mode 100644 (file)
index 0000000..e5c66d2
--- /dev/null
@@ -0,0 +1,75 @@
+// $Id$
+//
+// Copyright (C) 2007 
+// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
+// Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
+//     Stefan Bund <g0dil@berlios.de>
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the
+// Free Software Foundation, Inc.,
+// 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+/** \file
+    \brief ActiveFeeder.test unit tests */
+
+//#include "ActiveFeeder.test.hh"
+//#include "ActiveFeeder.test.ih"
+
+// Custom includes
+#include "ActiveFeeder.hh"
+#include "DebugModules.hh"
+#include "Setup.hh"
+
+#include <boost/test/auto_unit_test.hpp>
+#include <boost/test/test_tools.hpp>
+
+#define prefix_
+///////////////////////////////cc.p////////////////////////////////////////
+
+namespace debug = senf::ppi::module::debug;
+namespace ppi = senf::ppi;
+namespace module = senf::ppi::module;
+
+BOOST_AUTO_UNIT_TEST(activeFeeder)
+{
+    debug::PassivePacketSource source;
+    debug::PassivePacketSink sink;
+    module::ActiveFeeder feeder;
+
+    ppi::connect(source,feeder);
+    ppi::connect(feeder,sink);
+
+    source.submit(senf::DataPacket::create());
+    source.submit(senf::DataPacket::create());
+    source.submit(senf::DataPacket::create());
+
+    ppi::run();
+
+    BOOST_CHECK_EQUAL( source.size(), 0u );
+    BOOST_CHECK_EQUAL( sink.size(), 3u );
+}
+
+///////////////////////////////cc.e////////////////////////////////////////
+#undef prefix_
+
+\f
+// Local Variables:
+// mode: c++
+// fill-column: 100
+// comment-column: 40
+// c-file-style: "senf"
+// indent-tabs-mode: nil
+// ispell-local-dictionary: "american"
+// compile-command: "scons -u test"
+// End:
index 6d47b63..3824628 100644 (file)
@@ -185,7 +185,7 @@ namespace connector {
 
                                              \param[in] handler Handler to call on throttle
                                                  notifications. */
-        void onThrottle();
+        void onThrottle();              ///< Clear throttle notification handler
 
         template <class Handler>
         void onUnthrottle(Handler handler); ///< Register unthrottle notification handler
@@ -198,9 +198,9 @@ namespace connector {
 
                                              \param[in] handle Handler to call on unthrottle
                                                  notifications. */
-        void onUnthrottle();
+        void onUnthrottle();            ///< Clear unthrottle notification handler
 
-        bool throttled() const;
+        bool throttled() const;         ///< \c true, if peer() is throttled
 
         PassiveConnector & peer() const;
 
@@ -326,7 +326,7 @@ namespace connector {
 
         ActiveOutput & peer() const;
 
-        bool boolean_test() const;
+        bool boolean_test() const;      ///< \c true, if ! empty()
 
         template <class QDisc>
         void qdisc(QDisc const & disc); ///< Change the queueing discipline
@@ -352,9 +352,9 @@ namespace connector {
     public:
         ActiveInput & peer() const;
 
-        bool boolean_test() const;
+        bool boolean_test() const;      ///< Always \c true
 
-        void connect(ActiveInput & target);
+        void connect(ActiveInput & target); ///< Internal: Use senf::ppi::connect() instead
 
         friend class ActiveInput;
     };
@@ -368,7 +368,7 @@ namespace connector {
     public:
         PassiveOutput & peer() const;
 
-        bool boolean_test() const;
+        bool boolean_test() const;      ///< \c true, if ! empty() or ! throttled()
 
         void request();                 ///< request more packets without dequeuing any packet
 
@@ -385,9 +385,9 @@ namespace connector {
     public:
         PassiveInput & peer() const;
 
-        bool boolean_test() const;
+        bool boolean_test() const;      ///< \c true if peer() is ! throttled()
 
-        void connect(PassiveInput & target);
+        void connect(PassiveInput & target); ///< Internal: Use senf::ppi::connect() instead
     };
 
     ///@}
index 14fbb02..2c70982 100644 (file)
 //#include "DebugModules.mpp"
 ///////////////////////////////hh.p////////////////////////////////////////
 
+/** \namespace senf::ppi::module::debug
+    \brief Debug modules
+
+    This namespace collects several modules helpful for PPI debugging. The modules allow to manually
+    pass packets into a network and read back the output packets.
+
+    
+ */
+
 namespace senf {
 namespace ppi {
 namespace module {
 namespace debug {
     
+    /** \brief
+     */
     class ActivePacketSource
         : public Module, 
           public SafeBool<ActivePacketSource>
index fdde4c0..4df0c2a 100644 (file)
 #define prefix_
 ///////////////////////////////cc.p////////////////////////////////////////
 
+namespace debug = senf::ppi::module::debug;
+namespace ppi = senf::ppi;
+
 BOOST_AUTO_UNIT_TEST(debugModules)
 {
-    namespace debug = senf::ppi::module::debug;
-    namespace ppi = senf::ppi;
-
     {
         debug::ActivePacketSource source;
         debug::PassivePacketSink sink;
index 9d518ff..1b99c4b 100644 (file)
@@ -91,6 +91,8 @@ namespace ppi {
         detail::EventBinding<EventType> & binding();
     };
     
+#ifndef DOXYGEN
+
     template <class Self>
     class EventImplementationHelper<void,Self>
     {
@@ -102,6 +104,8 @@ namespace ppi {
         detail::EventBinding<void> & binding();
     };
 
+#endif
+
     template <class EventType>
     class EventImplementation
         : public EventDescriptor, 
index 02c0586..1e342a0 100644 (file)
@@ -40,12 +40,16 @@ namespace detail {
         typedef EventType const & type;
     };
 
+#ifndef DOXYGEN
+
     template <>
     struct EventArgType<void>
     {
         typedef void type;
     };
 
+#endif
+
 }}}
 
 ///////////////////////////////ih.e////////////////////////////////////////
diff --git a/PPI/IdleEvent.cc b/PPI/IdleEvent.cc
new file mode 100644 (file)
index 0000000..fcbe357
--- /dev/null
@@ -0,0 +1,73 @@
+// $Id$
+//
+// Copyright (C) 2007 
+// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
+// Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
+//     Stefan Bund <g0dil@berlios.de>
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the
+// Free Software Foundation, Inc.,
+// 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+/** \file
+    \brief IdleEvent non-inline non-template implementation */
+
+#include "IdleEvent.hh"
+//#include "IdleEvent.ih"
+
+// Custom includes
+#include "Scheduler/Scheduler.hh"
+
+//#include "IdleEvent.mpp"
+#define prefix_
+///////////////////////////////cc.p////////////////////////////////////////
+
+///////////////////////////////////////////////////////////////////////////
+// senf::ppi::IdleEvent
+
+////////////////////////////////////////
+// private members
+
+prefix_ void senf::ppi::IdleEvent::v_enable()
+{
+    id_ = Scheduler::instance().timeout(manager().now(), boost::bind(&IdleEvent::cb,this));
+}
+
+prefix_ void senf::ppi::IdleEvent::v_disable()
+{
+    Scheduler::instance().cancelTimeout(id_);
+    id_ = 0;
+}
+
+prefix_ void senf::ppi::IdleEvent::cb()
+{
+    callback();
+    if (enabled())
+        v_enable();
+}
+
+///////////////////////////////cc.e////////////////////////////////////////
+#undef prefix_
+//#include "IdleEvent.mpp"
+
+\f
+// Local Variables:
+// mode: c++
+// fill-column: 100
+// comment-column: 40
+// c-file-style: "senf"
+// indent-tabs-mode: nil
+// ispell-local-dictionary: "american"
+// compile-command: "scons -u test"
+// End:
diff --git a/PPI/IdleEvent.cci b/PPI/IdleEvent.cci
new file mode 100644 (file)
index 0000000..4d997a8
--- /dev/null
@@ -0,0 +1,50 @@
+// $Id$
+//
+// Copyright (C) 2007 
+// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
+// Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
+//     Stefan Bund <g0dil@berlios.de>
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the
+// Free Software Foundation, Inc.,
+// 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+/** \file
+    \brief IdleEvent inline non-template implementation */
+
+// Custom includes
+
+#define prefix_ inline
+///////////////////////////////cci.p///////////////////////////////////////
+
+///////////////////////////////////////////////////////////////////////////
+// senf::ppi::IdleEvent
+
+prefix_ senf::ppi::IdleEvent::IdleEvent()
+    : id_(0)
+{}
+
+///////////////////////////////cci.e///////////////////////////////////////
+#undef prefix_
+
+\f
+// Local Variables:
+// mode: c++
+// fill-column: 100
+// comment-column: 40
+// c-file-style: "senf"
+// indent-tabs-mode: nil
+// ispell-local-dictionary: "american"
+// compile-command: "scons -u test"
+// End:
diff --git a/PPI/IdleEvent.hh b/PPI/IdleEvent.hh
new file mode 100644 (file)
index 0000000..3064380
--- /dev/null
@@ -0,0 +1,73 @@
+// $Id$
+//
+// Copyright (C) 2007 
+// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
+// Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
+//     Stefan Bund <g0dil@berlios.de>
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the
+// Free Software Foundation, Inc.,
+// 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+/** \file
+    \brief IdleEvent public header */
+
+#ifndef HH_IdleEvent_
+#define HH_IdleEvent_ 1
+
+// Custom includes
+#include "Events.hh"
+
+//#include "IdleEvent.mpp"
+///////////////////////////////hh.p////////////////////////////////////////
+
+namespace senf {
+namespace ppi {
+
+    class IdleEvent
+        : public EventImplementation<>
+    {
+    public:
+        IdleEvent();
+
+    protected:
+
+    private:
+        virtual void v_enable();
+        virtual void v_disable();
+
+        void cb();
+        
+        unsigned id_;
+    };
+
+}}
+
+
+///////////////////////////////hh.e////////////////////////////////////////
+#include "IdleEvent.cci"
+//#include "IdleEvent.ct"
+//#include "IdleEvent.cti"
+#endif
+
+\f
+// Local Variables:
+// mode: c++
+// fill-column: 100
+// comment-column: 40
+// c-file-style: "senf"
+// indent-tabs-mode: nil
+// ispell-local-dictionary: "american"
+// compile-command: "scons -u test"
+// End:
index 766fc16..287d88a 100644 (file)
@@ -50,6 +50,7 @@ prefix_ void senf::ppi::IntervalTimer::v_enable()
 prefix_ void senf::ppi::IntervalTimer::v_disable()
 {
     Scheduler::instance().cancelTimeout(id_);
+    id_ = 0;
 }
 
 prefix_ void senf::ppi::IntervalTimer::schedule()
@@ -61,6 +62,8 @@ prefix_ void senf::ppi::IntervalTimer::schedule()
 prefix_ void senf::ppi::IntervalTimer::cb()
 {
     callback(info_, info_.expected);
+    if (! enabled())
+        return;
     ++ info_.number;
     if (info_.number >= eventsPerInterval_) {
         info_.number = 0;
index f057473..cfb0631 100644 (file)
@@ -50,9 +50,6 @@ namespace ppi {
     {
     public:
         ///////////////////////////////////////////////////////////////////////////
-        // Types
-
-        ///////////////////////////////////////////////////////////////////////////
         ///\name Structors and default members
         ///@{
 
index e100b08..f664d70 100644 (file)
@@ -58,6 +58,8 @@ senf::ppi::module::PriorityJoin::connect(Source & source)
 ///////////////////////////////////////////////////////////////////////////
 // namespace members
 
+#ifndef DOXYGEN
+
 template <class Source>
 prefix_ senf::ppi::connector::PassiveInput & senf::ppi::connect(Source & source,
                                                                 module::PassiveJoin & target)
@@ -72,6 +74,8 @@ prefix_ senf::ppi::connector::ActiveInput & senf::ppi::connect(Source & source,
     return target.connect(source);
 }
 
+#endif
+
 ///////////////////////////////cti.e///////////////////////////////////////
 #undef prefix_
 
index 7276384..88b72d5 100644 (file)
 namespace senf {
 namespace ppi {
 
+#ifndef DOXYGEN
+
     template <class Source>
     connector::PassiveInput & connect(Source & source, module::PassiveJoin & target);
     
     template <class Source>
     connector::ActiveInput & connect(Source & source, module::PriorityJoin & target);
 
+#endif
+
 namespace module {
 
     class PassiveJoin
index 24fdf0c..4b4323c 100644 (file)
@@ -126,8 +126,6 @@ namespace module {
 
         ClockService::clock_type now() const;
 
-        void destroy();
-
 #ifndef DOXYGEN
         virtual void macro_SENF_PPI_MODULE_missing() = 0;
 #endif
@@ -135,6 +133,12 @@ namespace module {
     private:
         virtual void init();
 
+#ifndef DOXYGEN
+    public:
+#endif
+        void destroy();
+        
+    private:
         EventManager & eventManager() const;
         ModuleManager & moduleManager() const;
         
index 55c65d2..bda5e66 100644 (file)
@@ -45,12 +45,27 @@ prefix_ void senf::ppi::ModuleManager::init()
         (*i)->init();
 }
 
+struct senf::ppi::ModuleManager::RunGuard
+{
+    RunGuard(ModuleManager & m) : manager(m) { manager.running_ = true; }
+    ~RunGuard() { manager.running_ = false; }
+    ModuleManager & manager;
+};
+
 prefix_ void senf::ppi::ModuleManager::run()
 {
     init();
+    RunGuard guard (*this);
     Scheduler::instance().process();
 }
 
+////////////////////////////////////////
+// private members
+
+prefix_ senf::ppi::ModuleManager::ModuleManager()
+    : running_(false), terminate_(false)
+{}
+
 ///////////////////////////////cc.e////////////////////////////////////////
 #undef prefix_
 //#include "ModuleManager.mpp"
index f8b2a08..56f9a10 100644 (file)
@@ -50,6 +50,12 @@ prefix_ void senf::ppi::ModuleManager::unregisterModule(module::Module & module)
         moduleRegistry_.end());
 }
 
+prefix_ bool senf::ppi::ModuleManager::running()
+    const
+{
+    return running_;
+}
+
 ///////////////////////////////cci.e///////////////////////////////////////
 #undef prefix_
 
index abf7cbc..843562b 100644 (file)
@@ -63,12 +63,19 @@ namespace ppi {
         void init();
         void run();
 
-    protected:
+        bool running() const;
 
     private:
+        ModuleManager();
+
         typedef std::vector<module::Module *> ModuleRegistry;
 
+        struct RunGuard;
+        friend class RunGuard;
+
         ModuleRegistry moduleRegistry_;
+        bool running_;
+        bool terminate_;
     };
 
 
index b99d93d..7637d3e 100644 (file)
@@ -59,6 +59,8 @@ namespace detail {
         typedef Connector type;
     };
 
+#ifndef DOXYGEN
+
     // RoutingTraits specialization for Event types. Events may be both dataSource or dataTarget but
     // cannot be notifySource.
     template <class Event>
@@ -72,6 +74,8 @@ namespace detail {
 
         typedef EventDescriptor type;
     };
+
+#endif
     
     // The RoutingTraits give routing related information about the argument type:
     //  - Wether the type is a notifySource or notifyTarget
index f8f556b..bba3381 100644 (file)
@@ -32,6 +32,8 @@
 #define prefix_ inline
 ///////////////////////////////cci.p///////////////////////////////////////
 
+#ifndef DOXYGEN
+
 prefix_ void senf::ppi::connect(connector::ActiveOutput & source,
                                 connector::PassiveInput & target)
 {
@@ -54,6 +56,8 @@ prefix_ void senf::ppi::init()
     ModuleManager::instance().init();
 }
 
+#endif
+
 ///////////////////////////////cci.e///////////////////////////////////////
 #undef prefix_
 
index fa119e6..caf151f 100644 (file)
@@ -30,6 +30,8 @@
 #define prefix_ inline
 ///////////////////////////////cti.p///////////////////////////////////////
 
+#ifndef DOXYGEN
+
 template <class M, class C>
 prefix_ void
 senf::ppi::connect(M & source, C & target,
@@ -57,6 +59,8 @@ senf::ppi::connect(M1 & source, M2 & target,
     connect(source.output, target.input);
 }
 
+#endif
+
 ///////////////////////////////cti.e///////////////////////////////////////
 #undef prefix_
 
index 768cb98..5d23953 100644 (file)
@@ -65,6 +65,8 @@ namespace detail {
         static type make(boost::function<void()> callable, Owner &);
     };
 
+#ifndef DOXYGEN
+
     template <>
     struct Callback<void>
     {
@@ -76,6 +78,8 @@ namespace detail {
         static type make(type callable, Owner &);
     };
 
+#endif
+
 }}}
 
 ///////////////////////////////hh.e////////////////////////////////////////
index 0840b03..e60ab58 100644 (file)
@@ -73,6 +73,8 @@ namespace detail {
         Self & self();
     };
 
+#ifndef DOXYGEN
+
     template <class Self>
     class EventBindingHelper<void,Self>
     {
@@ -84,6 +86,8 @@ namespace detail {
         Self & self();
     };
 
+#endif
+
     template <class EventType>
     class EventBinding
         : public EventBindingBase, 
index 3d5f40f..0480011 100644 (file)
@@ -64,14 +64,14 @@ namespace senf {
     // amount the time has been changed. To do this we need an as accurate as possible approximation
     // of the expected current time value. We need to differentiate two cases:
     //
-    // a) Clock skew detected in within now()
+    // a) Clock skew detected within now()
     //
-    // In this case, we use getitimer() to find the time remaining in the timer. Using this value and
-    // an the saved gettimeofday() value we can adjust base_ accordingly.
+    // In this case, we use getitimer() to find the time remaining in the timer. Using this value
+    // and the saved gettimeofday() value we can adjust base_ accordingly.
     //
     // b) Clock skew detected in the signal handler
     //
-    // In this case we use the save gettimeofday() value + CheckInterval to adjust base_.
+    // In this case we use the saved gettimeofday() value + CheckInterval to adjust base_.
     
     /** \brief Reliable high precision monotonous clock source
 
@@ -90,7 +90,7 @@ namespace senf {
             Unsigned integer type representing scheduler time. Scheduler time is measured in
             nanoseconds relative to some implementation defined reference time.
          */
-        typedef boost::uint_fast64_t clock_type;
+        typedef boost::int_fast64_t clock_type;
 
         /** \brief Absolute time data type
 
index 5285fa7..b6485b1 100644 (file)
@@ -155,7 +155,7 @@ prefix_ void senf::Scheduler::process()
 {
     terminate_ = false;
     eventTime_ = ClockService::now();
-    while (! terminate_) {
+    while (! terminate_ && ( ! timerQueue_.empty() || ! fdTable_.empty())) {
         while ( ! timerQueue_.empty() && timerQueue_.top()->second.timeout <= eventTime_ ) {
             TimerMap::iterator i (timerQueue_.top());
             if (! i->second.canceled)
@@ -167,26 +167,27 @@ prefix_ void senf::Scheduler::process()
         if (terminate_)
             return;
 
-        int timeout (MinTimeout);
+        int timeout (-1);
         if (! timerQueue_.empty()) {
             ClockService::clock_type delta (
                 (timerQueue_.top()->second.timeout - eventTime_)/1000000UL);
-            if (delta<MinTimeout)
-                timeout = int(delta);
+            timeout = delta < 0 ? 0 : delta;
         }
 
+        ///\fixme Handle more than one epoll_event per call
         struct epoll_event ev;
         int events = epoll_wait(epollFd_, &ev, 1, timeout);
         if (events<0)
-            // 'man epoll' says, epoll will not return with EINTR.
-            throw SystemException(errno);
+            // even though 'man epoll' does not mention EINTR the reality is different ...
+            if (errno != EINTR)
+                throw SystemException(errno);
 
         /// \fixme Fix unneeded timer delays
         // Hmm ... I remember, I purposely moved the timeout-handlers to the loop top ... but why?
         // This delays possible time-critical handlers even further ...
 
         eventTime_ = ClockService::now();
-        if (events==0)
+        if (events <= 0)
             // Timeout .. the handler will be run when going back to the loop top
             continue;
 
index a727400..f88a979 100644 (file)
@@ -40,11 +40,12 @@ prefix_ senf::Scheduler::Scheduler & senf::Scheduler::instance()
 prefix_ unsigned senf::Scheduler::timeout(ClockService::clock_type timeout,
                                           TimerCallback const & cb)
 {
+    ++ timerIdCounter_;
     TimerMap::iterator i (
         timerMap_.insert(std::make_pair(timerIdCounter_, 
                                         TimerSpec(timeout,cb,timerIdCounter_))).first);
     timerQueue_.push(i);
-    return timerIdCounter_++;
+    return timerIdCounter_;
 }
 
 prefix_ void senf::Scheduler::cancelTimeout(unsigned id)
index 3f6550c..e5c045c 100644 (file)
@@ -116,6 +116,8 @@ namespace senf {
                 variable. The C++ standard then provides above guarantee. The instance will be
                 initialized the first time, the code flow passes the variable declaration found in
                 the instance() body.
+
+            \fixme TimerQueue as \c map \e and \c priority_queue doesn't make sense ...
          */
         static Scheduler & instance();
 
@@ -175,8 +177,6 @@ namespace senf {
     private:
         typedef boost::function<void (EventId)> SimpleCallback;
 
-        static unsigned const MinTimeout = 1000;
-
         Scheduler();
 
         void do_add(int fd, SimpleCallback const & cb, int eventMask = EV_ALL);