action.sa_flags = SA_RESTART;
CheckError( sigaction, (SIGALRM, &action, restart ? 0 : &impl_->oldaction) );
+ restartTimer(restart);
+
+ impl_->unblock();
+}
+
+prefix_ void senf::ClockService::restartTimer(bool restart)
+{
struct itimerval itimer;
itimer.it_interval.tv_sec = CheckInterval;
itimer.it_interval.tv_usec = 0;
itimer.it_value.tv_sec = CheckInterval;
itimer.it_value.tv_usec = 0;
CheckError( setitimer, (ITIMER_REAL, &itimer, restart ? 0 : &impl_->olditimer) );
-
- impl_->unblock();
}
prefix_ void senf::ClockService::updateSkew(boost::posix_time::ptime time)
+ boost::posix_time::seconds(CheckInterval)
- boost::posix_time::seconds(itimer.it_value.tv_sec)
- boost::posix_time::microseconds(itimer.it_value.tv_usec)));
+ heartbeat_ = time;
+ restartTimer();
}
}
void updateSkew(boost::posix_time::ptime time);
void clockSkew(boost::posix_time::ptime time, boost::posix_time::ptime expected);
+ void restartTimer(bool restart = true);
+
boost::posix_time::ptime base_;
boost::posix_time::ptime heartbeat_;
BOOST_CHECK_PREDICATE( is_close_clock,
(t1 + senf::ClockService::milliseconds(200))
(senf::ClockService::now()) );
-
- // We need restart the clock-service here to fix up the bad heartbeat value. That's faster
- // than waiting another CheckInterval seconds for SIGALRM
- senf::ClockService::restart();
+
+ // The next check validates that the clock service itimer/heartbeat_ is correctly reset after a
+ // clock-skew is detected
+
+ BOOST_CHECK_PREDICATE( is_close_clock,
+ (t1 + senf::ClockService::milliseconds(200))
+ (senf::ClockService::now()) );
}
///////////////////////////////cc.e////////////////////////////////////////