diff options
Diffstat (limited to 'cpp/src/IceUtil/Timer.cpp')
-rw-r--r-- | cpp/src/IceUtil/Timer.cpp | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/cpp/src/IceUtil/Timer.cpp b/cpp/src/IceUtil/Timer.cpp index 1645b86df9f..31a6884b75a 100644 --- a/cpp/src/IceUtil/Timer.cpp +++ b/cpp/src/IceUtil/Timer.cpp @@ -65,7 +65,13 @@ Timer::schedule(const TimerTaskPtr& task, const IceUtil::Time& delay) throw IllegalArgumentException(__FILE__, __LINE__, "timer destroyed"); } - IceUtil::Time time = IceUtil::Time::now(IceUtil::Time::Monotonic) + delay; + IceUtil::Time now = IceUtil::Time::now(IceUtil::Time::Monotonic); + IceUtil::Time time = now + delay; + if(delay > IceUtil::Time() && time < now) + { + throw IllegalArgumentException(__FILE__, __LINE__, "invalid delay"); + } + bool inserted = _tasks.insert(make_pair(task, time)).second; if(!inserted) { @@ -88,7 +94,13 @@ Timer::scheduleRepeated(const TimerTaskPtr& task, const IceUtil::Time& delay) throw IllegalArgumentException(__FILE__, __LINE__, "timer destroyed"); } - const Token token(IceUtil::Time::now(IceUtil::Time::Monotonic) + delay, delay, task); + IceUtil::Time now = IceUtil::Time::now(IceUtil::Time::Monotonic); + const Token token(now + delay, delay, task); + if(delay > IceUtil::Time() && token.scheduledTime < now) + { + throw IllegalArgumentException(__FILE__, __LINE__, "invalid delay"); + } + bool inserted = _tasks.insert(make_pair(task, token.scheduledTime)).second; if(!inserted) { |