From c10f0a639b6aa63fa35e6f79b789538b613ed18c Mon Sep 17 00:00:00 2001 From: Noah Hilverling Date: Tue, 14 Nov 2017 11:03:05 +0100 Subject: [PATCH] RingBuffer: Add CalculateRate() refs #5750 --- lib/base/ringbuffer.cpp | 18 ++++++++++++++++-- lib/base/ringbuffer.hpp | 2 ++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/lib/base/ringbuffer.cpp b/lib/base/ringbuffer.cpp index b8bcce93b..4e023e7ab 100644 --- a/lib/base/ringbuffer.cpp +++ b/lib/base/ringbuffer.cpp @@ -20,11 +20,12 @@ #include "base/ringbuffer.hpp" #include "base/objectlock.hpp" #include "base/utility.hpp" +#include using namespace icinga; RingBuffer::RingBuffer(RingBuffer::SizeType slots) - : Object(), m_Slots(slots, 0), m_TimeValue(0) + : Object(), m_Slots(slots, 0), m_TimeValue(0), m_InsertedValues(0) { } RingBuffer::SizeType RingBuffer::GetLength(void) const @@ -40,6 +41,9 @@ void RingBuffer::InsertValue(RingBuffer::SizeType tv, int num) RingBuffer::SizeType offsetTarget = tv % m_Slots.size(); + if (m_TimeValue == 0) + m_InsertedValues = 1; + if (tv > m_TimeValue) { RingBuffer::SizeType offset = m_TimeValue % m_Slots.size(); @@ -51,6 +55,9 @@ void RingBuffer::InsertValue(RingBuffer::SizeType tv, int num) offset = 0; m_Slots[offset] = 0; + + if (m_TimeValue != 0 && m_InsertedValues < m_Slots.size()) + m_InsertedValues++; } m_TimeValue = tv; @@ -68,7 +75,7 @@ int RingBuffer::UpdateAndGetValues(RingBuffer::SizeType tv, RingBuffer::SizeType if (span > m_Slots.size()) span = m_Slots.size(); - int off = m_TimeValue % m_Slots.size();; + int off = m_TimeValue % m_Slots.size(); int sum = 0; while (span > 0) { sum += m_Slots[off]; @@ -82,3 +89,10 @@ int RingBuffer::UpdateAndGetValues(RingBuffer::SizeType tv, RingBuffer::SizeType return sum; } + +double RingBuffer::CalculateRate(RingBuffer::SizeType tv, RingBuffer::SizeType span) +{ + ObjectLock olock(this); + int sum = UpdateAndGetValues(tv, span); + return sum / static_cast(std::min(span, m_InsertedValues)); +} diff --git a/lib/base/ringbuffer.hpp b/lib/base/ringbuffer.hpp index 94063c563..d81515858 100644 --- a/lib/base/ringbuffer.hpp +++ b/lib/base/ringbuffer.hpp @@ -44,10 +44,12 @@ public: SizeType GetLength(void) const; void InsertValue(SizeType tv, int num); int UpdateAndGetValues(SizeType tv, SizeType span); + double CalculateRate(SizeType tv, SizeType span); private: std::vector m_Slots; SizeType m_TimeValue; + SizeType m_InsertedValues; }; } -- 2.40.0