]> granicus.if.org Git - icinga2/commitdiff
RingBuffer: Add CalculateRate()
authorNoah Hilverling <noah.hilverling@icinga.com>
Tue, 14 Nov 2017 10:03:05 +0000 (11:03 +0100)
committerNoah Hilverling <noah.hilverling@icinga.com>
Tue, 14 Nov 2017 10:06:56 +0000 (11:06 +0100)
refs #5750

lib/base/ringbuffer.cpp
lib/base/ringbuffer.hpp

index b8bcce93b4936fe16b113ce16946251ff57d7f30..4e023e7abd770f886726a8f9c5b91b11cc6162a6 100644 (file)
 #include "base/ringbuffer.hpp"
 #include "base/objectlock.hpp"
 #include "base/utility.hpp"
+#include <algorithm>
 
 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<double>(std::min(span, m_InsertedValues));
+}
index 94063c5635972f857e4fb5d46921b2c63ff03bd2..d8151585850f7452049ee52f2ab13e52e929d192 100644 (file)
@@ -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<int> m_Slots;
        SizeType m_TimeValue;
+       SizeType m_InsertedValues;
 };
 
 }