]> granicus.if.org Git - icinga2/commitdiff
Update the RingBuffer class to use a regular mutex instead of ObjectLock 5968/head
authorGunnar Beutner <gunnar.beutner@icinga.com>
Wed, 10 Jan 2018 15:44:48 +0000 (16:44 +0100)
committerGunnar Beutner <gunnar.beutner@icinga.com>
Thu, 11 Jan 2018 09:40:19 +0000 (10:40 +0100)
lib/base/ringbuffer.cpp
lib/base/ringbuffer.hpp

index f7fd4d8824ae35dd0ade031c783f6b88b461078f..9e3b1c840711eecb19088eb6cfb74795e1b51370 100644 (file)
 using namespace icinga;
 
 RingBuffer::RingBuffer(RingBuffer::SizeType slots)
-       : Object(), m_Slots(slots, 0), m_TimeValue(0), m_InsertedValues(0)
+       : m_Slots(slots, 0), m_TimeValue(0), m_InsertedValues(0)
 { }
 
 RingBuffer::SizeType RingBuffer::GetLength() const
 {
-       ObjectLock olock(this);
-
+       boost::mutex::scoped_lock lock(m_Mutex);
        return m_Slots.size();
 }
 
 void RingBuffer::InsertValue(RingBuffer::SizeType tv, int num)
 {
-       ObjectLock olock(this);
+       boost::mutex::scoped_lock lock(m_Mutex);
+
+       InsertValueUnlocked(tv, num);
+}
 
+void RingBuffer::InsertValueUnlocked(RingBuffer::SizeType tv, int num)
+{
        RingBuffer::SizeType offsetTarget = tv % m_Slots.size();
 
        if (m_TimeValue == 0)
@@ -68,9 +72,14 @@ void RingBuffer::InsertValue(RingBuffer::SizeType tv, int num)
 
 int RingBuffer::UpdateAndGetValues(RingBuffer::SizeType tv, RingBuffer::SizeType span)
 {
-       ObjectLock olock(this);
+       boost::mutex::scoped_lock lock(m_Mutex);
 
-       InsertValue(tv, 0);
+       return UpdateAndGetValuesUnlocked(tv, span);
+}
+
+int RingBuffer::UpdateAndGetValuesUnlocked(RingBuffer::SizeType tv, RingBuffer::SizeType span)
+{
+       InsertValueUnlocked(tv, 0);
 
        if (span > m_Slots.size())
                span = m_Slots.size();
@@ -92,7 +101,8 @@ int RingBuffer::UpdateAndGetValues(RingBuffer::SizeType tv, RingBuffer::SizeType
 
 double RingBuffer::CalculateRate(RingBuffer::SizeType tv, RingBuffer::SizeType span)
 {
-       ObjectLock olock(this);
-       int sum = UpdateAndGetValues(tv, span);
+       boost::mutex::scoped_lock lock(m_Mutex);
+
+       int sum = UpdateAndGetValuesUnlocked(tv, span);
        return sum / static_cast<double>(std::min(span, m_InsertedValues));
 }
index 94917668a875fd4475b4c66e5b8b65897a1ba4ef..44a96f868a5c9dfde4121243dd226f26ebb40f1a 100644 (file)
@@ -22,6 +22,7 @@
 
 #include "base/i2-base.hpp"
 #include "base/object.hpp"
+#include <boost/thread/mutex.hpp>
 #include <vector>
 
 namespace icinga
@@ -32,7 +33,7 @@ namespace icinga
  *
  * @ingroup base
  */
-class RingBuffer final : public Object
+class RingBuffer final
 {
 public:
        DECLARE_PTR_TYPEDEFS(RingBuffer);
@@ -47,9 +48,13 @@ public:
        double CalculateRate(SizeType tv, SizeType span);
 
 private:
+       mutable boost::mutex m_Mutex;
        std::vector<int> m_Slots;
        SizeType m_TimeValue;
        SizeType m_InsertedValues;
+
+       void InsertValueUnlocked(SizeType tv, int num);
+       int UpdateAndGetValuesUnlocked(SizeType tv, SizeType span);
 };
 
 }