diff options
Diffstat (limited to 'qpid/cpp/src/qpid/sys/Timer.cpp')
-rw-r--r-- | qpid/cpp/src/qpid/sys/Timer.cpp | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/qpid/cpp/src/qpid/sys/Timer.cpp b/qpid/cpp/src/qpid/sys/Timer.cpp index 5ed117db93..d569fb3bb7 100644 --- a/qpid/cpp/src/qpid/sys/Timer.cpp +++ b/qpid/cpp/src/qpid/sys/Timer.cpp @@ -55,9 +55,10 @@ void TimerTask::fireTask() { fire(); } +// This can only be used to setup the next fire time. After the Timer has already fired void TimerTask::setupNextFire() { if (period && readyToFire()) { - nextFireTime = AbsTime(nextFireTime, period); + nextFireTime = max(AbsTime::now(), AbsTime(nextFireTime, period)); cancelled = false; } else { QPID_LOG(error, "Couldn't setup next timer firing: " << Duration(nextFireTime, AbsTime::now()) << "[" << period << "]"); @@ -66,13 +67,11 @@ void TimerTask::setupNextFire() { // Only allow tasks to be delayed void TimerTask::restart() { nextFireTime = max(nextFireTime, AbsTime(AbsTime::now(), period)); } -void TimerTask::delayTill(AbsTime time) { period = 0; nextFireTime = max(nextFireTime, time); } void TimerTask::cancel() { ScopedLock<Mutex> l(callbackLock); cancelled = true; } -bool TimerTask::isCancelled() const { return cancelled; } Timer::Timer() : active(false) @@ -98,13 +97,13 @@ void Timer::run() // warn on extreme lateness AbsTime start(AbsTime::now()); - Duration late(t->sortTime, start); - if (late > 500 * TIME_MSEC) { - QPID_LOG(warning, "Timer delayed by " << late / TIME_MSEC << "ms"); - } + Duration delay(t->sortTime, start); { ScopedLock<Mutex> l(t->callbackLock); if (t->cancelled) { + if (delay > 500 * TIME_MSEC) { + QPID_LOG(debug, "cancelled Timer woken up " << delay / TIME_MSEC << "ms late"); + } continue; } else if(Duration(t->nextFireTime, start) >= 0) { Monitor::ScopedUnlock u(monitor); @@ -112,7 +111,17 @@ void Timer::run() // Warn on callback overrun AbsTime end(AbsTime::now()); Duration overrun(tasks.top()->nextFireTime, end); - if (overrun > 1 * TIME_MSEC) { + bool late = delay > 1 * TIME_MSEC; + bool overran = overrun > 1 * TIME_MSEC; + if (late) + if (overran) { + QPID_LOG(warning, + "Timer woken up " << delay / TIME_MSEC << "ms late, " + "overrunning by " << overrun / TIME_MSEC << "ms [taking " + << Duration(start, end) << "]"); + } else { + QPID_LOG(warning, "Timer woken up " << delay / TIME_MSEC << "ms late"); + } else if (overran) { QPID_LOG(warning, "Timer callback overran by " << overrun / TIME_MSEC << "ms [taking " << Duration(start, end) << "]"); |