IBR-DTNSuite
0.8
|
00001 /* 00002 * Clock.cpp 00003 * 00004 * Created on: 17.07.2009 00005 * Author: morgenro 00006 */ 00007 00008 #include "core/WallClock.h" 00009 #include "core/TimeEvent.h" 00010 #include <ibrdtn/utils/Clock.h> 00011 #include <ibrcommon/thread/MutexLock.h> 00012 00013 namespace dtn 00014 { 00015 namespace core 00016 { 00017 WallClock::WallClock(size_t frequency) : _frequency(frequency), _next(0), _timer(*this, frequency) 00018 { 00019 } 00020 00021 WallClock::~WallClock() 00022 { 00023 } 00024 00025 void WallClock::sync() 00026 { 00027 try { 00028 ibrcommon::MutexLock l(*this); 00029 wait(); 00030 } catch (const ibrcommon::Conditional::ConditionalAbortException &ex) { 00031 00032 } 00033 } 00034 00035 void WallClock::componentUp() 00036 { 00037 if(_timer.isRunning()) 00038 { 00039 _timer.reset(); 00040 } 00041 else 00042 { 00043 _timer.start(); 00044 } 00045 } 00046 00047 void WallClock::componentDown() 00048 { 00049 _timer.pause(); 00050 } 00051 00052 size_t WallClock::timeout(ibrcommon::Timer*) 00053 { 00054 size_t dtntime = dtn::utils::Clock::getTime(); 00055 00056 if (dtntime == 0) 00057 { 00058 TimeEvent::raise(dtntime, dtn::utils::Clock::getUnixTimestamp(), TIME_SECOND_TICK); 00059 00060 ibrcommon::MutexLock l(*this); 00061 signal(true); 00062 } 00063 else if (_next <= dtntime) 00064 { 00065 TimeEvent::raise(dtntime, dtn::utils::Clock::getUnixTimestamp(), TIME_SECOND_TICK); 00066 _next = dtntime + _frequency; 00067 00068 ibrcommon::MutexLock l(*this); 00069 signal(true); 00070 } 00071 00072 return _frequency; 00073 } 00074 00075 const std::string WallClock::getName() const 00076 { 00077 return "WallClock"; 00078 } 00079 } 00080 }