IBR-DTNSuite  0.8
daemon/src/core/WallClock.cpp
Go to the documentation of this file.
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 }