IBR-DTN  1.0.0
WallClock.cpp
Go to the documentation of this file.
1 /*
2  * Clock.cpp
3  *
4  * Copyright (C) 2011 IBR, TU Braunschweig
5  *
6  * Written-by: Johannes Morgenroth <morgenroth@ibr.cs.tu-bs.de>
7  *
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  * http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  *
20  */
21 
22 #include "core/WallClock.h"
23 #include "core/TimeEvent.h"
24 #include <ibrdtn/utils/Clock.h>
25 #include <ibrcommon/thread/MutexLock.h>
26 #include <ibrcommon/Logger.h>
27 
28 namespace dtn
29 {
30  namespace core
31  {
32  WallClock::WallClock(const dtn::data::Timeout &frequency) : _frequency(frequency), _next(0), _timer(*this, frequency)
33  {
34  }
35 
37  {
38  }
39 
41  {
42  try {
43  ibrcommon::MutexLock l(*this);
44  wait();
45  } catch (const ibrcommon::Conditional::ConditionalAbortException &ex) {
46 
47  }
48  }
49 
50  void WallClock::componentUp() throw ()
51  {
52  // routine checked for throw() on 15.02.2013
53  if(_timer.isRunning())
54  {
55  _timer.reset();
56  }
57  else
58  {
59  try {
60  _timer.start();
61  } catch (const ibrcommon::ThreadException &ex) {
62  IBRCOMMON_LOGGER_TAG("WallClock", error) << ex.what() << IBRCOMMON_LOGGER_ENDL;
63  }
64  }
65  }
66 
67  void WallClock::componentDown() throw ()
68  {
69  _timer.pause();
70  }
71 
72  size_t WallClock::timeout(ibrcommon::Timer*)
73  {
75 
76  if (ts >= _next)
77  {
79  _next = ts.get<size_t>() + _frequency;
80 
81  ibrcommon::MutexLock l(*this);
82  signal(true);
83  }
84 
85  return _frequency;
86  }
87 
88  const std::string WallClock::getName() const
89  {
90  return "WallClock";
91  }
92  }
93 }
virtual void componentUp()
Definition: WallClock.cpp:50
static void raise(const dtn::data::Timestamp &timestamp, const TimeEventAction action)
Definition: TimeEvent.cpp:56
T get() const
Definition: SDNV.h:113
size_t Timeout
Definition: Number.h:35
static dtn::data::Timestamp getTime()
Definition: Clock.cpp:167
virtual const std::string getName() const
Definition: WallClock.cpp:88
virtual ~WallClock()
Definition: WallClock.cpp:36
virtual void componentDown()
Definition: WallClock.cpp:67
static dtn::data::Timestamp getMonotonicTimestamp()
Definition: Clock.cpp:175
WallClock(const dtn::data::Timeout &frequency)
Definition: WallClock.cpp:32
virtual size_t timeout(ibrcommon::Timer *)
Definition: WallClock.cpp:72