From b4150d2053b1da20398746f41baaa63726c7951f Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Fri, 12 Apr 2019 09:50:42 +0200 Subject: [PATCH] hooks: add a common base class for rate limiting hooks --- include/villas/hook.hpp | 9 +++++++++ include/villas/hooks/decimate.hpp | 15 +++++++++++++-- include/villas/hooks/limit_rate.hpp | 14 +++++++------- 3 files changed, 29 insertions(+), 9 deletions(-) diff --git a/include/villas/hook.hpp b/include/villas/hook.hpp index dcf78702b..253b8784c 100644 --- a/include/villas/hook.hpp +++ b/include/villas/hook.hpp @@ -140,6 +140,15 @@ public: } }; +class LimitHook : public Hook { + +public: + using Hook::Hook; + + virtual void setRate(double rate, double maxRate = -1) = 0; + +}; + class HookFactory : public plugin::Plugin { protected: diff --git a/include/villas/hooks/decimate.hpp b/include/villas/hooks/decimate.hpp index ec0cdf283..72261bb44 100644 --- a/include/villas/hooks/decimate.hpp +++ b/include/villas/hooks/decimate.hpp @@ -31,14 +31,25 @@ namespace villas { namespace node { -class DecimateHook : public Hook { +class DecimateHook : public LimitHook { protected: int ratio; unsigned counter; public: - using Hook::Hook; + using LimitHook::LimitHook; + + virtual void setRate(double rate, double maxRate = -1) + { + assert(maxRate > 0); + + int ratio = maxRate / rate; + if (ratio == 0) + ratio = 1; + + setRatio(ratio); + } void setRatio(int r) { diff --git a/include/villas/hooks/limit_rate.hpp b/include/villas/hooks/limit_rate.hpp index 2bed1f91a..26114b635 100644 --- a/include/villas/hooks/limit_rate.hpp +++ b/include/villas/hooks/limit_rate.hpp @@ -31,7 +31,7 @@ namespace villas { namespace node { -class LimitRateHook : public Hook { +class LimitRateHook : public LimitHook { protected: enum { @@ -44,18 +44,18 @@ protected: timespec last; public: - void setRate(double rate) - { - deadtime = 1.0 / rate; - } - LimitRateHook(struct path *p, struct node *n, int fl, int prio, bool en = true) : - Hook(p, n, fl, prio, en), + LimitHook(p, n, fl, prio, en), mode(LIMIT_RATE_LOCAL) { last = (timespec) { 0, 0 }; } + virtual void setRate(double rate, double maxRate = -1) + { + deadtime = 1.0 / rate; + } + virtual void parse(json_t *cfg); virtual int process(sample *smp);