epee: allow a random component in once_a_time timeouts

This commit is contained in:
moneromooo-monero 2019-10-17 12:13:17 +00:00
parent e108330248
commit dcff02e4c3
No known key found for this signature in database
GPG Key ID: 686F07454D6CEFC3

View File

@ -32,6 +32,7 @@
#include <list> #include <list>
#include <numeric> #include <numeric>
#include <random>
#include <boost/timer/timer.hpp> #include <boost/timer/timer.hpp>
#include <boost/uuid/uuid.hpp> #include <boost/uuid/uuid.hpp>
#include <boost/uuid/random_generator.hpp> #include <boost/uuid/random_generator.hpp>
@ -230,7 +231,7 @@ namespace math_helper
} }
} }
template<uint64_t scale, int default_interval, bool start_immediate = true> template<typename get_interval, bool start_immediate = true>
class once_a_time class once_a_time
{ {
uint64_t get_time() const uint64_t get_time() const
@ -251,12 +252,18 @@ namespace math_helper
#endif #endif
} }
void set_next_interval()
{
m_interval = get_interval()();
}
public: public:
once_a_time():m_interval(default_interval * scale) once_a_time()
{ {
m_last_worked_time = 0; m_last_worked_time = 0;
if(!start_immediate) if(!start_immediate)
m_last_worked_time = get_time(); m_last_worked_time = get_time();
set_next_interval();
} }
void trigger() void trigger()
@ -273,6 +280,7 @@ namespace math_helper
{ {
bool res = functr(); bool res = functr();
m_last_worked_time = get_time(); m_last_worked_time = get_time();
set_next_interval();
return res; return res;
} }
return true; return true;
@ -283,9 +291,13 @@ namespace math_helper
uint64_t m_interval; uint64_t m_interval;
}; };
template<uint64_t N> struct get_constant_interval { public: uint64_t operator()() const { return N; } };
template<int default_interval, bool start_immediate = true> template<int default_interval, bool start_immediate = true>
class once_a_time_seconds: public once_a_time<1000000, default_interval, start_immediate> {}; class once_a_time_seconds: public once_a_time<get_constant_interval<default_interval * (uint64_t)1000000>, start_immediate> {};
template<int default_interval, bool start_immediate = true> template<int default_interval, bool start_immediate = true>
class once_a_time_milliseconds: public once_a_time<1000, default_interval, start_immediate> {}; class once_a_time_milliseconds: public once_a_time<get_constant_interval<default_interval * (uint64_t)1000>, start_immediate> {};
template<typename get_interval, bool start_immediate = true>
class once_a_time_seconds_range: public once_a_time<get_interval, start_immediate> {};
} }
} }