MADARA  3.4.1
EpochEnforcer.h
Go to the documentation of this file.
1 #ifndef _MADARA_UTILITY_EPOCHENFORCER_H_
2 #define _MADARA_UTILITY_EPOCHENFORCER_H_
3 
4 #include <thread>
5 #include <chrono>
6 #include "IntTypes.h"
7 
8 namespace madara
9 {
10 namespace utility
11 {
16 template<typename CLOCK = std::chrono::steady_clock>
18 {
19 public:
25  EpochEnforcer(double period, double max_duration = -1)
26  {
27  start();
28  set_period(period);
29  set_duration(max_duration);
30  }
31 
35  inline void start(void)
36  {
37  start_ = CLOCK::now();
38  next_ = start_;
39  }
40 
45  inline void set_duration(double duration)
46  {
47  std::chrono::duration<double> temp_duration(duration);
48  auto duration_ns =
49  std::chrono::duration_cast<std::chrono::nanoseconds>(temp_duration);
50 
52  }
53 
58  inline void set_period(double period)
59  {
60  std::chrono::duration<double> temp_period(period);
61  period_ = std::chrono::duration_cast<std::chrono::nanoseconds>(temp_period);
62 
63  next_ = start_ + period_;
64  }
65 
69  inline void advance_next(void)
70  {
71  auto current_time = CLOCK::now();
72 
73  while (next_ <= current_time)
74  next_ += period_;
75  }
76 
81  inline bool has_reached_next(void) const
82  {
83  auto current_time = CLOCK::now();
84 
85  return current_time >= next_;
86  }
87 
91  inline void sleep_until_next(void)
92  {
94 
95  advance_next();
96  }
97 
102  inline bool is_done(void) const
103  {
104  return CLOCK::now() >= max_;
105  }
106 
111  inline uint64_t duration_ns(void) const
112  {
113  auto dur = std::chrono::duration_cast<std::chrono::nanoseconds>(
114  CLOCK::now() - start_);
115 
116  return (uint64_t)dur.count();
117  }
118 
123  inline uint64_t duration_s(void) const
124  {
125  auto dur =
126  std::chrono::duration_cast<std::chrono::seconds>(CLOCK::now() - start_);
127 
128  return (uint64_t)dur.count();
129  }
130 
135  inline double duration_ds(void) const
136  {
137  auto dur = std::chrono::duration_cast<std::chrono::duration<double>>(
138  CLOCK::now() - start_);
139 
140  return (double)dur.count();
141  }
142 
147  template<typename PERIOD = std::chrono::nanoseconds>
148  inline uint64_t duration(void) const
149  {
150  auto dur = std::chrono::duration_cast<PERIOD>(CLOCK::now() - start_);
151 
152  return (uint64_t)dur.count();
153  }
154 
155 private:
157  std::chrono::time_point<CLOCK> start_;
158 
160  std::chrono::time_point<CLOCK> max_;
161 
163  std::chrono::time_point<CLOCK> next_;
164 
166  std::chrono::nanoseconds period_;
167 };
168 }
169 }
170 
171 #endif // _MADARA_UTILITY_EPOCHENFORCER_H_
Enforces a periodic epoch.
Definition: EpochEnforcer.h:18
void start(void)
Starts the timer.
Definition: EpochEnforcer.h:35
bool is_done(void) const
Checks to see if max duration is finished.
bool has_reached_next(void) const
Checks if current time is at or past next.
Definition: EpochEnforcer.h:81
std::chrono::time_point< CLOCK > next_
the next epoch to sleep to
EpochEnforcer(double period, double max_duration=-1)
Constructor.
Definition: EpochEnforcer.h:25
std::chrono::nanoseconds period_
the period of the epochs
uint64_t duration(void) const
Returns a duration in user-specified period.
uint64_t duration_ns(void) const
Returns a duration in nanoseconds.
double duration_ds(void) const
Returns a duration in seconds (double format)
uint64_t duration_s(void) const
Returns a duration in seconds.
std::chrono::time_point< CLOCK > max_
the end of the timer duration
void advance_next(void)
Advance next.
Definition: EpochEnforcer.h:69
void sleep_until_next(void)
Sleeps until the next epoch.
Definition: EpochEnforcer.h:91
void set_duration(double duration)
Sets the maximum duration for the enforcer.
Definition: EpochEnforcer.h:45
std::chrono::time_point< CLOCK > start_
the start of the timer duration
void set_period(double period)
Sets the period for the enforcer.
Definition: EpochEnforcer.h:58
Provides utility functions and classes for common tasks and needs.
Definition: IteratorImpl.h:15
Duration sleep_until(TimeValue wake)
Definition: Utility.cpp:612
Copyright(c) 2020 Galois.