Open Lighting Architecture 0.10.9
Loading...
Searching...
No Matches
Backoff.h
1/*
2 * This library is free software; you can redistribute it and/or
3 * modify it under the terms of the GNU Lesser General Public
4 * License as published by the Free Software Foundation; either
5 * version 2.1 of the License, or (at your option) any later version.
6 *
7 * This library is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
10 * Lesser General Public License for more details.
11 *
12 * You should have received a copy of the GNU Lesser General Public
13 * License along with this library; if not, write to the Free Software
14 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
15 *
16 * Backoff.h
17 * Copyright (C) 2013 Simon Newton
18 */
19
20#ifndef INCLUDE_OLA_UTIL_BACKOFF_H_
21#define INCLUDE_OLA_UTIL_BACKOFF_H_
22
23#include <math.h>
24#include <ola/Clock.h>
25#include <memory>
26
27namespace ola {
28
34 public:
35 BackOffPolicy() {}
36 virtual ~BackOffPolicy() {}
37
44 virtual TimeInterval BackOffTime(unsigned int failed_attempts) const = 0;
45};
46
47
53 public:
54 explicit ConstantBackoffPolicy(const TimeInterval &duration)
55 : m_duration(duration) {
56 }
57
58 TimeInterval BackOffTime(unsigned int) const {
59 return m_duration;
60 }
61
62 private:
63 const TimeInterval m_duration;
64};
65
66
74 public:
75 LinearBackoffPolicy(const TimeInterval &duration, const TimeInterval &max)
76 : m_duration(duration),
77 m_max(max) {
78 }
79
80 TimeInterval BackOffTime(unsigned int failed_attempts) const {
81 TimeInterval interval = m_duration * failed_attempts;
82 if (interval > m_max)
83 interval = m_max;
84 return interval;
85 }
86
87 private:
88 const TimeInterval m_duration;
89 const TimeInterval m_max;
90};
91
92
99 public:
101 const TimeInterval &max)
102 : m_initial(initial),
103 m_max(max) {
104 }
105
106 TimeInterval BackOffTime(unsigned int failed_attempts) const {
107 TimeInterval interval = (
108 m_initial * static_cast<int>(::pow(2, failed_attempts - 1)));
109 if (interval > m_max)
110 interval = m_max;
111 return interval;
112 }
113
114 private:
115 const TimeInterval m_initial;
116 const TimeInterval m_max;
117};
118
119
120// TODO(simon): add an ExponentialJitterBackoffPolicy
121
122// Generates backoff times.
124 public:
125 explicit BackoffGenerator(const BackOffPolicy *policy)
126 : m_policy(policy),
127 m_failures(0) {
128 }
129
130 TimeInterval Next() {
131 return m_policy->BackOffTime(++m_failures);
132 }
133
134 void Reset() {
135 m_failures = 0;
136 }
137
138 private:
139 std::auto_ptr<const BackOffPolicy> m_policy;
140 unsigned int m_failures;
141};
142} // namespace ola
143#endif // INCLUDE_OLA_UTIL_BACKOFF_H_
Definition Backoff.h:33
virtual TimeInterval BackOffTime(unsigned int failed_attempts) const =0
Calculate the backoff time.
Definition Backoff.h:123
Definition Backoff.h:52
TimeInterval BackOffTime(unsigned int) const
Calculate the backoff time.
Definition Backoff.h:58
Definition Backoff.h:98
TimeInterval BackOffTime(unsigned int failed_attempts) const
Calculate the backoff time.
Definition Backoff.h:106
Definition Backoff.h:73
TimeInterval BackOffTime(unsigned int failed_attempts) const
Calculate the backoff time.
Definition Backoff.h:80
Definition Clock.h:126
The namespace containing all OLA symbols.
Definition Credentials.cpp:44