+class NopStateStrategy(object):
+
+ def __init__(self):
+ pass
+
+ def initialize_state(self):
+ pass
+
+ def increment_state(self):
+ pass
+
+ @property
+ def timeout(self):
+ return UpdateStateMachine.INFINITE_PERIOD
+
+
+class ConstantStateStrategy(object):
+
+ def __init__(self, timeout):
+ assert 0 < timeout or timeout == UpdateStateMachine.INFINITE_PERIOD
+ self._timeout = timeout
+
+ def initialize_state(self):
+ pass
+
+ def increment_state(self):
+ pass
+
+ @property
+ def timeout(self):
+ return self._timeout
+
+
+class GeometricStateStrategy(object):
+
+ def __init__(self, init, min, max):
+ assert 0 < init and init < max and init != UpdateStateMachine.INFINITE_PERIOD
+ assert 0 < min and min != UpdateStateMachine.INFINITE_PERIOD
+ assert min < max or max == UpdateStateMachine.INFINITE_PERIOD
+ self._min = min
+ self._max = max
+ self._init = init
+ self._current = 0
+
+ def initialize_state(self):
+ self._current = self._min
+
+ def increment_state(self):
+ if self._max == UpdateStateMachine.INFINITE_PERIOD:
+ self._current *= 2
+ else:
+ self._current = min(2 * self._current, self._max - self._init)
+
+ @property
+ def timeout(self):
+ timeout = self._init + self._current
+ return timeout
+
+