diff --git a/lib/icinga/checkable-flapping.cpp b/lib/icinga/checkable-flapping.cpp index 544c97678..9efd5f38e 100644 --- a/lib/icinga/checkable-flapping.cpp +++ b/lib/icinga/checkable-flapping.cpp @@ -17,28 +17,55 @@ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ******************************************************************************/ -#include #include "icinga/checkable.hpp" #include "icinga/icingaapplication.hpp" #include "base/utility.hpp" using namespace icinga; +template +struct Bitset +{ +public: + Bitset(T value) + : m_Data(value) + { } + + void Modify(int index, bool bit) + { + if (bit) + m_Data |= 1 << index; + else + m_Data &= ~(1 << index); + } + + bool Get(int index) const + { + return m_Data & (1 << index); + } + + T GetValue() const + { + return m_Data; + } + +private: + T m_Data{0}; +}; + void Checkable::UpdateFlappingStatus(bool stateChange) { -/* TODO: Add support for Windows satellites/masters. */ -#ifndef _WIN32 /* _WIN32 */ - std::bitset<20> stateChangeBuf = GetFlappingBuffer(); + Bitset stateChangeBuf = GetFlappingBuffer(); int oldestIndex = GetFlappingIndex(); - stateChangeBuf[oldestIndex] = stateChange; + stateChangeBuf.Modify(oldestIndex, stateChange); oldestIndex = (oldestIndex + 1) % 20; double stateChanges = 0; /* Iterate over our state array and compute a weighted total */ for (int i = 0; i < 20; i++) { - if (stateChangeBuf[(oldestIndex + i) % 20]) + if (stateChangeBuf.Get((oldestIndex + i) % 20)) stateChanges += 0.8 + (0.02 * i); } @@ -51,15 +78,13 @@ void Checkable::UpdateFlappingStatus(bool stateChange) else flapping = flappingValue > GetFlappingThresholdHigh(); - SetFlappingBuffer(stateChangeBuf.to_ulong()); + SetFlappingBuffer(stateChangeBuf.GetValue()); SetFlappingIndex(oldestIndex); SetFlappingCurrent(flappingValue); SetFlapping(flapping, true); if (flapping != GetFlapping()) SetFlappingLastChange(Utility::GetTime()); - -#endif /* _WIN32 */ } bool Checkable::IsFlapping() const