summaryrefslogtreecommitdiff
path: root/qpid/cpp/src/qpid/sys/Timer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'qpid/cpp/src/qpid/sys/Timer.cpp')
-rw-r--r--qpid/cpp/src/qpid/sys/Timer.cpp25
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) << "]");