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);