00001 #include "TimerHandler.h"
00002 #include "Scheduler.h"
00003 #include "NumberGen.h"
00004
00005 TimerHandler::TimerHandler(std::string desc) :
00006 description(desc), scheduled(false), running(false),
00007 id(NumberGen::Instance("TimerHandler")->GetVal()) {
00008 }
00009
00010 void TimerHandler::cancel() {
00011 if (scheduled) {
00012 Scheduler::Instance().cancel(*this);
00013 }
00014 scheduled = false;
00015 running = false;
00016 }
00017
00018 uint64_t TimerHandler::schedule(uint64_t time, bool abs, bool align) {
00019 assert(!scheduled);
00020 scheduled = true;
00021 running = true;
00022
00023 if (align && (time % (1000*1000) == 0)) {
00024 uint64_t now = TimeUtil::timeu();
00025 uint sec = time / (1000*1000);
00026 uint64_t sleep = 1000*1000;
00027 sleep -= (now % (1000 * 1000));
00028 if (sleep < 500*1000) {
00029 sleep += 1000*1000;
00030 }
00031 time = (sec - 1) * 1000*1000 + sleep;
00032 }
00033
00034 return Scheduler::Instance().schedule(*this, time, abs);
00035 }