X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Scheduler%2FFIFORunner.hh;h=6513f72396485bc575b2e800e995376db6438915;hb=a1fdb7bb122f0b05be809a922d4b7ef5e125fa67;hp=3ad8d7e1850380d33531951f5e5708698f0ebca8;hpb=919e588a2c387c9a910aa8761e65155a0d205bba;p=senf.git diff --git a/Scheduler/FIFORunner.hh b/Scheduler/FIFORunner.hh index 3ad8d7e..6513f72 100644 --- a/Scheduler/FIFORunner.hh +++ b/Scheduler/FIFORunner.hh @@ -23,13 +23,16 @@ /** \file \brief FIFORunner public header */ -#ifndef HH_FIFORunner_ -#define HH_FIFORunner_ 1 +#ifndef HH_SENF_Scheduler_FIFORunner_ +#define HH_SENF_Scheduler_FIFORunner_ 1 // Custom includes +#include #include #include "../boost/intrusive/ilist.hpp" #include "../boost/intrusive/ilist_hook.hpp" +#include "../Utils/singleton.hh" +#include "EventManager.hh" //#include "FIFORunner.mpp" ///////////////////////////////hh.p//////////////////////////////////////// @@ -37,10 +40,12 @@ namespace senf { namespace scheduler { - /** \brief - */ + void restart(); + +namespace detail { + class FIFORunner - : boost::noncopyable + : public singleton { public: struct TaskInfo; @@ -48,46 +53,108 @@ namespace scheduler { private: struct TaskListTag; typedef boost::intrusive::ilist_base_hook TaskListBase; - typedef TaskListBase::value_traits TaskListType; - typedef boost::intrusive::ilist TaskList; + typedef boost::intrusive::ilist, false> TaskList; public: - /////////////////////////////////////////////////////////////////////////// - // Types - - struct TaskInfo - : public TaskListBase + class TaskInfo + : public Event, + public TaskListBase { - TaskInfo(); + public: + enum Priority { PRIORITY_LOW = 0, PRIORITY_NORMAL = 1, PRIORITY_HIGH = 2 }; + + explicit TaskInfo(std::string const & name, Priority priority=PRIORITY_NORMAL); virtual ~TaskInfo(); - bool runnable; - virtual void run() = 0; - }; + void run(); - /////////////////////////////////////////////////////////////////////////// - ///\name Structors and default members - ///@{ + bool runnable() const; - FIFORunner(); + protected: + void setRunnable(); + + private: + virtual void v_run() = 0; + virtual bool v_enabled() const; - ///@} - /////////////////////////////////////////////////////////////////////////// + bool runnable_; + Priority priority_; +# ifdef SENF_DEBUG + std::string backtrace_; +# endif + + friend class FIFORunner; + }; + + typedef boost::filter_iterator< + EventManager::IteratorFilter, TaskList::const_iterator> iterator; + + using singleton::instance; + using singleton::alive; void enqueue(TaskInfo * task); void dequeue(TaskInfo * task); void run(); + void taskTimeout(unsigned ms); + unsigned taskTimeout() const; + void abortOnTimeout(bool flag); + bool abortOnTimeout() const; + + void startWatchdog(); + void stopWatchdog(); + + unsigned hangCount(); + + iterator begin() const; + iterator end() const; + + void yield(); + protected: private: + FIFORunner(); + ~FIFORunner(); + + static void watchdog(int, siginfo_t *, void *); + + TaskList::iterator priorityEnd(TaskInfo::Priority p); + void run(TaskList::iterator f, TaskList::iterator l); + + struct NullTask : public TaskInfo + { + NullTask(); + ~NullTask(); + virtual void v_run();; + virtual char const * v_type() const; + virtual std::string v_info() const; + }; + TaskList tasks_; TaskList::iterator next_; - }; + NullTask normalPriorityEnd_; + NullTask highPriorityEnd_; + + timer_t watchdogId_; + bool watchdogRunning_; + unsigned watchdogMs_; + bool watchdogAbort_; + std::string runningName_; +# ifdef SENF_DEBUG + std::string runningBacktrace_; +# endif + unsigned watchdogCount_; + unsigned hangCount_; + bool yield_; + + friend void senf::scheduler::restart(); + friend class singleton; + }; -}} +}}} ///////////////////////////////hh.e//////////////////////////////////////// #include "FIFORunner.cci"