X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Scheduler%2FClockService.cc;h=44b54046e365c07df2d566f7c36d0aa33acfe25e;hb=58e527462abb46e321c94fda65f758b67ac3aef2;hp=a614462add9fe6ac82671b071700b427abf6c2ff;hpb=e8b91aa6a817af6d9a3714e7b66be6c0d6b0a4e5;p=senf.git diff --git a/Scheduler/ClockService.cc b/Scheduler/ClockService.cc index a614462..44b5404 100644 --- a/Scheduler/ClockService.cc +++ b/Scheduler/ClockService.cc @@ -1,8 +1,8 @@ // $Id$ // // Copyright (C) 2007 -// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS) -// Kompetenzzentrum fuer Satelitenkommunikation (SatCom) +// Fraunhofer Institute for Open Communication Systems (FOKUS) +// Competence Center NETwork research (NET), St. Augustin, GERMANY // Stefan Bund // // This program is free software; you can redistribute it and/or modify @@ -31,13 +31,13 @@ #include #include #include -#include "Utils/Exception.hh" +#include "../Utils/Exception.hh" //#include "ClockService.mpp" #define prefix_ ///////////////////////////////cc.p//////////////////////////////////////// -#define CheckError(op,args) if (op args < 0) throw SystemException(# op, errno) +#define CheckError(op,args) if (op args < 0) throwErrno(# op, errno) /////////////////////////////////////////////////////////////////////////// // senf::ClockService::Impl @@ -49,6 +49,7 @@ struct senf::ClockService::Impl void block(); void unblock(); + /// Internal: temporarily block signals (RAII idiom) struct Blocker { Blocker(Impl * i) : impl(i) { impl->block(); } ~Blocker() { impl->unblock(); } @@ -125,14 +126,19 @@ prefix_ void senf::ClockService::restart_m(bool restart) 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) @@ -149,6 +155,8 @@ 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(); } }