00001 // -*- C++ -*- 00020 #ifndef COIL_PERIODICTASK_H 00021 #define COIL_PERIODICTASK_H 00022 00023 #include <map> 00024 #include <string> 00025 #include <vector> 00026 #include <algorithm> 00027 00028 #include <coil/Mutex.h> 00029 #include <coil/Guard.h> 00030 #include <coil/Condition.h> 00031 #include <coil/TimeValue.h> 00032 #include <coil/TimeMeasure.h> 00033 #include <coil/PeriodicTaskBase.h> 00034 00035 namespace coil 00036 { 00059 class PeriodicTask 00060 : public coil::PeriodicTaskBase 00061 { 00062 public: 00063 typedef coil::Guard<coil::Mutex> Guard; 00064 00072 PeriodicTask(); 00073 00081 virtual ~PeriodicTask(); 00082 00105 virtual void activate(); 00106 00120 virtual void finalize(); 00121 00135 virtual int suspend(void); 00136 00150 virtual int resume(void); 00151 00165 virtual void signal(); 00166 00180 virtual bool setTask(TaskFuncBase* func, bool delete_in_dtor = true); 00181 00182 template <class O, class F> 00183 bool setTask(O* obj, F fun) 00184 { 00185 return this->setTask(new TaskFunc<O, F>(obj, fun)); 00186 } 00187 00201 virtual void setPeriod(double period); 00202 00216 virtual void setPeriod(TimeValue& period); 00217 00225 virtual void executionMeasure(bool value); 00226 00234 virtual void executionMeasureCount(int n); 00235 00243 virtual void periodicMeasure(bool value); 00244 00252 virtual void periodicMeasureCount(int n); 00253 00261 virtual TimeMeasure::Statistics getExecStat(); 00262 00270 virtual TimeMeasure::Statistics getPeriodStat(); 00271 00272 protected: 00273 virtual int svc(); 00274 virtual void sleep(); 00275 virtual void updateExecStat(); 00276 virtual void updatePeriodStat(); 00277 00278 protected: 00279 // execution period 00280 coil::TimeValue m_period; 00281 bool m_nowait; 00282 TaskFuncBase* m_func; 00283 bool m_deleteInDtor; 00284 00285 // alive flag 00286 class alive_t 00287 { 00288 public: 00289 alive_t(bool val) : value(val) {} 00290 bool value; 00291 coil::Mutex mutex; 00292 }; 00293 alive_t m_alive; 00294 00295 // suspend flag 00296 struct suspend_t 00297 { 00298 suspend_t(bool sus) : suspend(sus), mutex(), cond(mutex) {} 00299 bool suspend; 00300 coil::Mutex mutex; 00301 coil::Condition<coil::Mutex> cond; 00302 }; 00303 suspend_t m_suspend; 00304 00305 // time measurement statistics struct 00306 struct statistics_t 00307 { 00308 coil::TimeMeasure::Statistics stat; 00309 coil::Mutex mutex; 00310 }; 00311 00312 // variables for execution time measurement 00313 bool m_execMeasure; 00314 unsigned int m_execCount; 00315 unsigned int m_execCountMax; 00316 statistics_t m_execStat; 00317 coil::TimeMeasure m_execTime; 00318 00319 // variables for period time measurement 00320 bool m_periodMeasure; 00321 unsigned int m_periodCount; 00322 unsigned int m_periodCountMax; 00323 statistics_t m_periodStat; 00324 coil::TimeMeasure m_periodTime; 00325 00326 }; 00327 00328 }; // namespace coil 00329 00330 #endif // COIL_PERIODICTASK_H