/****************************************************************************** * Icinga 2 * * Copyright (C) 2012 Icinga Development Team (http://www.icinga.org/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * * as published by the Free Software Foundation; either version 2 * * of the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the Free Software Foundation * * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ******************************************************************************/ #ifndef TIMER_H #define TIMER_H #include "base/i2-base.h" #include "base/object.h" #include #include #include #include #include #include #include #include namespace icinga { class Timer; /** * @ingroup base */ struct TimerNextExtractor { typedef double result_type; double operator()(const weak_ptr& wtimer); }; /** * A timer that periodically triggers an event. * * @ingroup base */ class I2_BASE_API Timer : public Object { public: typedef shared_ptr Ptr; typedef weak_ptr WeakPtr; typedef std::list CollectionType; Timer(void); void SetInterval(double interval); double GetInterval(void) const; static void AdjustTimers(double adjustment); void Start(void); void Stop(void); void Reschedule(double next = -1); double GetNext(void) const; boost::signals2::signal OnTimerExpired; static void Initialize(void); static void Uninitialize(void); private: double m_Interval; /**< The interval of the timer. */ double m_Next; /**< When the next event should happen. */ bool m_Started; /**< Whether the timer is enabled. */ typedef boost::multi_index_container< Timer::WeakPtr, boost::multi_index::indexed_by< boost::multi_index::ordered_unique >, boost::multi_index::ordered_non_unique > > TimerSet; static boost::mutex m_Mutex; static boost::condition_variable m_CV; static boost::thread m_Thread; static bool m_StopThread; static TimerSet m_Timers; void Call(); static void TimerThreadProc(void); friend struct TimerNextExtractor; }; } #endif /* TIMER_H */