14 #include <boost/bind.hpp> 30 asiolink::IntervalTimer interval_timer_;
50 TimerInfo(asiolink::IOService& io_service,
54 : interval_timer_(io_service),
55 user_callback_(user_callback),
57 scheduling_mode_(mode) { };
95 void registerTimer(
const std::string& timer_name,
109 void unregisterTimer(
const std::string& timer_name);
115 void unregisterTimers();
122 bool isTimerRegistered(
const std::string& timer_name);
125 size_t timersCount()
const;
139 void setup(
const std::string& timer_name);
146 void cancel(
const std::string& timer_name);
154 void timerCallback(
const std::string& timer_name);
164 TimerMgrImpl::TimerMgrImpl() :
165 io_service_(new
IOService()), registered_timers_() {
173 io_service_ = io_service;
183 if (timer_name.empty()) {
188 if (registered_timers_.find(timer_name) != registered_timers_.end()) {
190 << timer_name <<
"'");
196 TimerInfoPtr timer_info(
new TimerInfo(*io_service_, callback,
197 interval, scheduling_mode));
200 registered_timers_.insert(std::pair<std::string, TimerInfoPtr>(timer_name,
208 TimerInfoMap::iterator timer_info_it = registered_timers_.find(timer_name);
211 if (timer_info_it == registered_timers_.end()) {
213 << timer_name <<
"'");
220 registered_timers_.erase(timer_info_it);
234 TimerInfoMap registered_timers_copy(registered_timers_);
237 for (TimerInfoMap::iterator timer_info_it = registered_timers_copy.begin();
238 timer_info_it != registered_timers_copy.end(); ++timer_info_it) {
245 return (registered_timers_.find(timer_name) != registered_timers_.end());
250 return (registered_timers_.size());
257 TimerInfoMap::const_iterator timer_info_it = registered_timers_.find(timer_name);
258 if (timer_info_it == registered_timers_.end()) {
260 "no such timer registered");
268 timer_info->interval_timer_.setup(cb, timer_info->interval_,
269 timer_info->scheduling_mode_);
276 TimerInfoMap::const_iterator timer_info_it = registered_timers_.find(timer_name);
277 if (timer_info_it == registered_timers_.end()) {
279 "no such timer registered");
282 timer_info_it->second->interval_timer_.cancel();
286 TimerMgrImpl::timerCallback(
const std::string& timer_name) {
288 TimerInfoMap::iterator timer_info_it = registered_timers_.find(timer_name);
289 if (timer_info_it != registered_timers_.end()) {
295 DHCPSRV_TIMERMGR_RUN_TIMER_OPERATION)
296 .arg(timer_info_it->first);
298 std::string error_string;
300 timer_info_it->second->user_callback_();
302 }
catch (
const std::exception& ex){
303 error_string = ex.what();
306 error_string =
"unknown reason";
310 if (!error_string.empty()) {
312 .arg(timer_info_it->first)
340 DHCPSRV_TIMERMGR_REGISTER_TIMER)
344 impl_->
registerTimer(timer_name, callback, interval, scheduling_mode);
351 DHCPSRV_TIMERMGR_UNREGISTER_TIMER)
361 DHCPSRV_TIMERMGR_UNREGISTER_ALL_TIMERS);
380 DHCPSRV_TIMERMGR_START_TIMER)
383 impl_->
setup(timer_name);
390 DHCPSRV_TIMERMGR_STOP_TIMER)
393 impl_->
cancel(timer_name);
void unregisterTimers()
Unregisters all timers.
boost::shared_ptr< TimerMgr > TimerMgrPtr
Type definition of the shared pointer to TimerMgr.
Implementation of the TimerMgr.
bool isTimerRegistered(const std::string &timer_name)
Checks if the timer with a specified name has been registered.
void registerTimer(const std::string &timer_name, const asiolink::IntervalTimer::Callback &callback, const long interval, const asiolink::IntervalTimer::Mode &scheduling_mode)
Registers new timer in the TimerMgr.
void cancel(const std::string &timer_name)
Cancels the execution of the interval timer.
void setIOService(const asiolink::IOServicePtr &io_service)
Sets IO service to be used by the Timer Manager.
Manages a pool of asynchronous interval timers.
void cancel(const std::string &timer_name)
Cancels the execution of the interval timer.
#define LOG_ERROR(LOGGER, MESSAGE)
Macro to conveniently test error output and log it.
boost::shared_ptr< IOService > IOServicePtr
Defines a smart pointer to an IOService instance.
bool isTimerRegistered(const std::string &timer_name)
Checks if the timer with a specified name has been registered.
The IOService class is a wrapper for the ASIO io_service class.
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
A generic exception that is thrown if a parameter given to a method is considered invalid in that con...
void unregisterTimers()
Unregisters all timers.
size_t timersCount() const
Returns the number of registered timers.
const int DHCPSRV_DBG_TRACE_DETAIL
Additional information.
Mode
Defines possible timer modes used to setup a timer.
boost::shared_ptr< TimerInfo > TimerInfoPtr
A type definition for the pointer to TimerInfo structure.
void setup(const std::string &timer_name)
Schedules the execution of the interval timer.
void setIOService(const IOServicePtr &io_service)
Sets IO service to be used by the Timer Manager.
Defines the logger used by the top-level component of kea-dhcp-ddns.
void unregisterTimer(const std::string &timer_name)
Unregisters specified timer.
void setup(const std::string &timer_name)
Schedules the execution of the interval timer.
#define LOG_DEBUG(LOGGER, LEVEL, MESSAGE)
Macro to conveniently test debug output and log it.
void registerTimer(const std::string &timer_name, const asiolink::IntervalTimer::Callback &callback, const long interval, const asiolink::IntervalTimer::Mode &scheduling_mode)
Registers new timer in the TimerMgr.
const int DHCPSRV_DBG_TRACE
DHCP server library logging levels.
boost::function< void()> Callback
isc::log::Logger dhcpsrv_logger("dhcpsrv")
DHCP server library Logger.
size_t timersCount() const
Returns the number of registered timers.
static const TimerMgrPtr & instance()
Returns pointer to the sole instance of the TimerMgr.
std::map< std::string, TimerInfoPtr > TimerInfoMap
A type definition for the map holding timers configuration.
void unregisterTimer(const std::string &timer_name)
Unregisters specified timer.