00001 // -*- C++ -*- 00019 #ifndef COIL_CLOCKMANAGER_H 00020 #define COIL_CLOCKMANAGER_H 00021 00022 #include <string> 00023 #include <coil/Singleton.h> 00024 #include <coil/TimeValue.h> 00025 #include <coil/Mutex.h> 00026 #include <coil/Guard.h> 00027 00028 namespace coil 00029 { 00052 class IClock 00053 { 00054 public: 00055 virtual ~IClock() {} 00065 virtual coil::TimeValue gettime() const = 0; 00075 virtual bool settime(coil::TimeValue clocktime) = 0; 00076 }; 00077 00091 class SystemClock 00092 : public IClock 00093 { 00094 public: 00095 virtual ~SystemClock(); 00096 virtual coil::TimeValue gettime() const; 00097 virtual bool settime(coil::TimeValue clocktime); 00098 }; 00099 00115 class LogicalClock 00116 : public IClock 00117 { 00118 public: 00119 LogicalClock(); 00120 virtual ~LogicalClock(); 00121 virtual coil::TimeValue gettime() const; 00122 virtual bool settime(coil::TimeValue clocktime); 00123 private: 00124 coil::TimeValue m_currentTime; 00125 mutable coil::Mutex m_currentTimeMutex; 00126 }; 00127 00143 class AdjustedClock 00144 : public IClock 00145 { 00146 public: 00147 AdjustedClock(); 00148 virtual ~AdjustedClock(); 00149 virtual coil::TimeValue gettime() const; 00150 virtual bool settime(coil::TimeValue clocktime); 00151 private: 00152 coil::TimeValue m_offset; 00153 mutable coil::Mutex m_offsetMutex; 00154 }; 00155 00175 class ClockManager 00176 #ifndef WIN32 00177 : public coil::Singleton<ClockManager> 00178 #endif 00179 { 00180 public: 00181 IClock& getClock(std::string clocktype); 00182 #ifdef WIN32 00183 static ClockManager& instance(); 00184 static ClockManager* clockmgr; 00185 static coil::Mutex clockmgr_mutex; 00186 private: 00187 ClockManager() {}; 00188 #endif 00189 private: 00190 SystemClock m_systemClock; 00191 LogicalClock m_logicalClock; 00192 AdjustedClock m_adjustedClock; 00193 }; 00194 }; // namespace coil 00195 #endif // COIL_CLOCKMANAGER_H