16#include <boost/scoped_ptr.hpp>
65 : interval_timer_(io_service),
66 user_callback_(user_callback),
68 scheduling_mode_(mode) { };
149 void setup(
const std::string& timer_name);
156 void cancel(
const std::string& timer_name);
174 void registerTimerInternal(
const std::string& timer_name,
188 void unregisterTimerInternal(
const std::string& timer_name);
194 void unregisterTimersInternal();
208 void setupInternal(
const std::string& timer_name);
215 void cancelInternal(
const std::string& timer_name);
221 void timerCallback(
const std::string& timer_name);
231 boost::scoped_ptr<std::mutex> mutex_;
235 registered_timers_(), mutex_(new std::mutex) {
244 io_service_ = io_service;
252 if (MultiThreadingMgr::instance().getMode()) {
253 std::lock_guard<std::mutex> lock(*mutex_);
254 registerTimerInternal(timer_name, callback, interval, scheduling_mode);
256 registerTimerInternal(timer_name, callback, interval, scheduling_mode);
261TimerMgrImpl::registerTimerInternal(
const std::string& timer_name,
266 if (timer_name.empty()) {
271 if (registered_timers_.find(timer_name) != registered_timers_.end()) {
273 << timer_name <<
"'");
279 TimerInfoPtr timer_info(
new TimerInfo(*io_service_, callback,
280 interval, scheduling_mode));
283 registered_timers_.insert(std::pair<std::string, TimerInfoPtr>(timer_name,
289 if (MultiThreadingMgr::instance().getMode()) {
290 std::lock_guard<std::mutex> lock(*mutex_);
291 unregisterTimerInternal(timer_name);
293 unregisterTimerInternal(timer_name);
298TimerMgrImpl::unregisterTimerInternal(
const std::string& timer_name) {
300 TimerInfoMap::iterator timer_info_it = registered_timers_.find(timer_name);
303 if (timer_info_it == registered_timers_.end()) {
305 << timer_name <<
"'");
309 cancelInternal(timer_name);
312 registered_timers_.erase(timer_info_it);
317 if (MultiThreadingMgr::instance().getMode()) {
318 std::lock_guard<std::mutex> lock(*mutex_);
319 unregisterTimersInternal();
321 unregisterTimersInternal();
326TimerMgrImpl::unregisterTimersInternal() {
336 TimerInfoMap registered_timers_copy(registered_timers_);
339 for (TimerInfoMap::iterator timer_info_it = registered_timers_copy.begin();
340 timer_info_it != registered_timers_copy.end(); ++timer_info_it) {
341 unregisterTimerInternal(timer_info_it->first);
347 if (MultiThreadingMgr::instance().getMode()) {
348 std::lock_guard<std::mutex> lock(*mutex_);
349 return (registered_timers_.find(timer_name) != registered_timers_.end());
351 return (registered_timers_.find(timer_name) != registered_timers_.end());
357 if (MultiThreadingMgr::instance().getMode()) {
358 std::lock_guard<std::mutex> lock(*mutex_);
359 return (registered_timers_.size());
361 return (registered_timers_.size());
367 if (MultiThreadingMgr::instance().getMode()) {
368 std::lock_guard<std::mutex> lock(*mutex_);
369 setupInternal(timer_name);
371 setupInternal(timer_name);
376TimerMgrImpl::setupInternal(
const std::string& timer_name) {
378 TimerInfoMap::const_iterator timer_info_it = registered_timers_.find(timer_name);
379 if (timer_info_it == registered_timers_.end()) {
381 "no such timer registered");
389 timer_info->interval_timer_.setup(cb, timer_info->interval_,
390 timer_info->scheduling_mode_);
395 if (MultiThreadingMgr::instance().getMode()) {
396 std::lock_guard<std::mutex> lock(*mutex_);
397 cancelInternal(timer_name);
399 cancelInternal(timer_name);
404TimerMgrImpl::cancelInternal(
const std::string& timer_name) {
406 TimerInfoMap::const_iterator timer_info_it = registered_timers_.find(timer_name);
407 if (timer_info_it == registered_timers_.end()) {
409 "no such timer registered");
412 timer_info_it->second->interval_timer_.cancel();
416TimerMgrImpl::timerCallback(
const std::string& timer_name) {
418 TimerInfoMap::iterator timer_info_it = registered_timers_.find(timer_name);
419 if (timer_info_it != registered_timers_.end()) {
426 .arg(timer_info_it->first);
428 std::string error_string;
430 timer_info_it->second->user_callback_();
432 }
catch (
const std::exception& ex){
433 error_string = ex.what();
436 error_string =
"unknown reason";
440 if (!error_string.empty()) {
442 .arg(timer_info_it->first)
459 impl_->unregisterTimers();
473 impl_->registerTimer(timer_name, callback, interval, scheduling_mode);
483 impl_->unregisterTimer(timer_name);
492 impl_->unregisterTimers();
497 return (impl_->isTimerRegistered(timer_name));
502 return (impl_->timersCount());
512 impl_->setup(timer_name);
522 impl_->cancel(timer_name);
527 impl_->setIOService(io_service);
A generic exception that is thrown if a parameter given to a method is considered invalid in that con...
The IOService class is a wrapper for the ASIO io_service class.
The IntervalTimer class is a wrapper for the ASIO boost::asio::deadline_timer class.
std::function< void()> Callback
Mode
Defines possible timer modes used to setup a timer.
Implementation of the TimerMgr.
void unregisterTimers()
Unregisters all timers.
size_t timersCount() const
Returns the number of registered timers.
void cancel(const std::string &timer_name)
Cancels the execution of the interval timer.
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 unregisterTimer(const std::string &timer_name)
Unregisters specified timer.
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.
TimerMgrImpl()
Constructor.
bool isTimerRegistered(const std::string &timer_name)
Checks if the timer with a specified name has been registered.
Manages a pool of asynchronous interval timers.
bool isTimerRegistered(const std::string &timer_name)
Checks if the timer with a specified name has been registered.
void setIOService(const asiolink::IOServicePtr &io_service)
Sets IO service to be used by the Timer Manager.
void setup(const std::string &timer_name)
Schedules the execution of the interval timer.
size_t timersCount() const
Returns the number of registered timers.
void unregisterTimers()
Unregisters all timers.
void cancel(const std::string &timer_name)
Cancels the execution of the interval timer.
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 unregisterTimer(const std::string &timer_name)
Unregisters specified timer.
static const TimerMgrPtr & instance()
Returns pointer to the sole instance of the TimerMgr.
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
#define LOG_ERROR(LOGGER, MESSAGE)
Macro to conveniently test error output and log it.
#define LOG_DEBUG(LOGGER, LEVEL, MESSAGE)
Macro to conveniently test debug output and log it.
boost::shared_ptr< IOService > IOServicePtr
Defines a smart pointer to an IOService instance.
isc::log::Logger dhcpsrv_logger("dhcpsrv")
DHCP server library Logger.
boost::shared_ptr< TimerMgr > TimerMgrPtr
Type definition of the shared pointer to TimerMgr.
const isc::log::MessageID DHCPSRV_TIMERMGR_UNREGISTER_ALL_TIMERS
std::map< std::string, TimerInfoPtr > TimerInfoMap
A type definition for the map holding timers configuration.
const isc::log::MessageID DHCPSRV_TIMERMGR_STOP_TIMER
const isc::log::MessageID DHCPSRV_TIMERMGR_RUN_TIMER_OPERATION
const int DHCPSRV_DBG_TRACE_DETAIL
Additional information.
const isc::log::MessageID DHCPSRV_TIMERMGR_START_TIMER
const isc::log::MessageID DHCPSRV_TIMERMGR_UNREGISTER_TIMER
boost::shared_ptr< TimerInfo > TimerInfoPtr
A type definition for the pointer to TimerInfo structure.
const isc::log::MessageID DHCPSRV_TIMERMGR_REGISTER_TIMER
const isc::log::MessageID DHCPSRV_TIMERMGR_CALLBACK_FAILED
const int DHCPSRV_DBG_TRACE
DHCP server library logging levels.
Defines the logger used by the top-level component of kea-lfc.