X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Scheduler%2FClockService.cc;h=d9733d8e8d67527df34df478c9ad695f9b3a597e;hb=04b5fd6be72efd504de15a215a268f8b82f4d132;hp=010bd2093a0aa32936ec1b1540dbcdc5061698e0;hpb=3d16600678b948ff3bd0e4fd2a1a800fcc629a03;p=senf.git diff --git a/Scheduler/ClockService.cc b/Scheduler/ClockService.cc index 010bd20..d9733d8 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) +// Copyright (C) 2007 +// 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,123 +31,12 @@ #include #include #include -#include "Utils/Exception.hh" +#include "../Utils/Exception.hh" //#include "ClockService.mpp" #define prefix_ ///////////////////////////////cc.p//////////////////////////////////////// -#define CheckErrno(op,args) if (op args < 0) throw SystemException(# op, errno) - -struct senf::ClockService::Impl -{ - Impl(); - - void block(); - void unblock(); - - struct Blocker { - Blocker(Impl * i) : impl(i) { impl->block(); } - ~Blocker() { impl->unblock(); } - Impl * impl; - }; - - static void timer(int); - - struct sigaction oldaction; - struct itimerval olditimer; - sigset_t alrm_set; -}; - -prefix_ senf::ClockService::Impl::Impl() -{ - CheckErrno( sigemptyset, (&alrm_set) ); - CheckErrno( sigaddset, (&alrm_set, SIGALRM) ); -} - -prefix_ void senf::ClockService::Impl::block() -{ - CheckErrno( sigprocmask, (SIG_BLOCK, &alrm_set, 0) ); -} - -prefix_ void senf::ClockService::Impl::unblock() -{ - CheckErrno( sigprocmask, (SIG_UNBLOCK, &alrm_set, 0) ); -} - -prefix_ void senf::ClockService::Impl::timer(int) -{ - boost::posix_time::ptime time (boost::posix_time::microsec_clock::universal_time()); - if (ClockService::instance().checkSkew(time)) - ClockService::instance().clockSkew( - time, ClockService::instance().heartbeat_ + boost::posix_time::seconds( - ClockService::CheckInterval)); - ClockService::instance().heartbeat_ = time; -} - -/////////////////////////////////////////////////////////////////////////// -// senf::ClockService - -prefix_ senf::ClockService::~ClockService() -{ - setitimer(ITIMER_REAL, &impl_->olditimer, 0); - sigaction(SIGALRM, &impl_->oldaction, 0); -} - -//////////////////////////////////////// -// private members - -prefix_ senf::ClockService::ClockService() - : base_ (boost::posix_time::microsec_clock::universal_time()), - heartbeat_ (base_), impl_(new ClockService::Impl()) -{ - struct sigaction action; - action.sa_handler = & senf::ClockService::Impl::timer; - CheckErrno( sigemptyset, (&action.sa_mask) ); - action.sa_flags = SA_RESTART; - CheckErrno( sigaction, (SIGALRM, &action, &impl_->oldaction) ); - - 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; - CheckErrno( setitimer, (ITIMER_REAL, &itimer, &impl_->olditimer) ); - impl_->unblock(); -} - -prefix_ void senf::ClockService::restart_i() -{ - impl_->block(); // if any syscall fails, the alarm signal stays blocked which is correct - base_ = boost::posix_time::microsec_clock::universal_time(); - heartbeat_ = base_; - - struct sigaction action; - action.sa_handler = & senf::ClockService::Impl::timer; - CheckErrno( sigemptyset, (&action.sa_mask) ); - action.sa_flags = SA_RESTART; - CheckErrno( sigaction, (SIGALRM, &action, 0) ); - - 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; - CheckErrno( setitimer, (ITIMER_REAL, &itimer, 0) ); - impl_->unblock(); -} - -prefix_ void senf::ClockService::updateSkew(boost::posix_time::ptime time) -{ - Impl::Blocker alrmBlocker (impl_.get()); - struct itimerval itimer; - CheckErrno( getitimer, (ITIMER_REAL, &itimer) ); - clockSkew(time, (heartbeat_ - + boost::posix_time::seconds(CheckInterval) - - boost::posix_time::seconds(itimer.it_value.tv_sec) - - boost::posix_time::microseconds(itimer.it_value.tv_usec))); -} - ///////////////////////////////cc.e//////////////////////////////////////// #undef prefix_ //#include "ClockService.mpp"