X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Scheduler%2FClockService.cci;h=791a403f63c5e2e9d6decae715abfbd2abcc58f2;hb=81f84badf27b66dbadec9890646ca1193e998505;hp=48f989d99c2a43e0aa5bb7bdfbcd3219696c1588;hpb=3d16600678b948ff3bd0e4fd2a1a800fcc629a03;p=senf.git diff --git a/Scheduler/ClockService.cci b/Scheduler/ClockService.cci index 48f989d..791a403 100644 --- a/Scheduler/ClockService.cci +++ b/Scheduler/ClockService.cci @@ -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 @@ -24,7 +24,9 @@ \brief ClockService inline non-template implementation */ // Custom includes -#include "boost/date_time/posix_time/posix_time_types.hpp" +#include +#include +#include "../Utils/Exception.hh" #define prefix_ inline ///////////////////////////////cci.p/////////////////////////////////////// @@ -34,95 +36,150 @@ prefix_ senf::ClockService::clock_type senf::ClockService::now() { - // We must make sure to call instance() before fetching the current time since the first call to - // instance() will construct the singleton and initialize heartbeat_. If this happens *after* - // fetching the current time checkSkew() will detect clock skew since heartbeat_ will be < - // current time. - return instance().now_i(); + struct timespec spec; + if (clock_gettime(CLOCK_MONOTONIC, &spec) < 0) + SENF_THROW_SYSTEM_EXCEPTION("clock_gettime()"); + return spec.tv_sec * 1000000000LL + spec.tv_nsec; } +//////////////////////////////////////// +// private members + +prefix_ senf::ClockService::clock_type senf::ClockService::clock_m(abstime_type time) +{ + if (now() - baseClock_ > 1000000000ll) + restart_m(); + boost::posix_time::time_duration delta (time - baseAbstime_); + return baseClock_ + clock_type( delta.ticks() ) + * clock_type( 1000000000UL / boost::posix_time::time_duration::ticks_per_second() ); +} + +prefix_ senf::ClockService::abstime_type senf::ClockService::abstime_m(clock_type clock) +{ + if (now() - baseClock_ > 1000000000ll) + restart_m(); +#ifdef BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG + return baseAbstime_ + boost::posix_time::nanoseconds(clock-baseClock_); +#else + return baseAbstime_ + boost::posix_time::microseconds((clock-baseClock_+500)/1000); +#endif +} + +prefix_ senf::ClockService::ClockService() +{ + restart_m(); +} + +prefix_ void senf::ClockService::restart_m() +{ + baseAbstime_ = boost::posix_time::microsec_clock::universal_time(); + baseClock_ = now(); +} + +// public members + prefix_ senf::ClockService::abstime_type senf::ClockService::abstime(clock_type clock) { + return instance().abstime_m(clock); +} + +prefix_ senf::ClockService::reltime_type senf::ClockService::reltime(clock_type clock) +{ #ifdef BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG - return instance().base_ + boost::posix_time::nanoseconds(clock); + return boost::posix_time::nanoseconds(clock); #else - return instance().base_ + boost::posix_time::microseconds((clock+500)/1000); + return boost::posix_time::microseconds((clock+500)/1000); #endif } prefix_ senf::ClockService::clock_type senf::ClockService::clock(abstime_type time) { - boost::posix_time::time_duration delta (time - instance().base_); - return clock_type( delta.ticks() ) - * clock_type( 1000000000UL / boost::posix_time::time_duration::ticks_per_second() ); + return instance().clock_m(time); +} + +prefix_ senf::ClockService::clock_type senf::ClockService::from_time_t(time_t const & time) +{ + return clock( boost::posix_time::from_time_t(time) ); } -prefix_ senf::ClockService::clock_type senf::ClockService::nanoseconds(clock_type v) +prefix_ senf::ClockService::clock_type senf::ClockService::nanoseconds(int64_type v) { return v; } -prefix_ senf::ClockService::clock_type senf::ClockService::microseconds(clock_type v) +prefix_ senf::ClockService::clock_type senf::ClockService::microseconds(int64_type v) { - return nanoseconds(1000*v); + return v * nanoseconds(1000); } -prefix_ senf::ClockService::clock_type senf::ClockService::milliseconds(clock_type v) +prefix_ senf::ClockService::clock_type senf::ClockService::milliseconds(int64_type v) { - return microseconds(1000*v); + return v * microseconds(1000); } -prefix_ senf::ClockService::clock_type senf::ClockService::seconds(clock_type v) +prefix_ senf::ClockService::clock_type senf::ClockService::seconds(int64_type v) { - return milliseconds(1000*v); + return v * milliseconds(1000); } -prefix_ senf::ClockService::clock_type senf::ClockService::minutes(clock_type v) +prefix_ senf::ClockService::clock_type senf::ClockService::minutes(int64_type v) { - return seconds(60*v); + return v * seconds(60); } -prefix_ senf::ClockService::clock_type senf::ClockService::hours(clock_type v) +prefix_ senf::ClockService::clock_type senf::ClockService::hours(int64_type v) { - return minutes(60*v); + return v * minutes(60); } -prefix_ senf::ClockService::clock_type senf::ClockService::days(clock_type v) +prefix_ senf::ClockService::clock_type senf::ClockService::days(int64_type v) { - return hours(24*v); + return v * hours(24); } -prefix_ void senf::ClockService::restart() +prefix_ senf::ClockService::clock_type senf::ClockService::in_nanoseconds(int64_type v) { - instance().restart_i(); + return v; } -//////////////////////////////////////// -// private members +prefix_ senf::ClockService::clock_type senf::ClockService::in_microseconds(int64_type v) +{ + return v / nanoseconds(1000); +} -prefix_ senf::ClockService & senf::ClockService::instance() +prefix_ senf::ClockService::clock_type senf::ClockService::in_milliseconds(int64_type v) { - static ClockService instance; - return instance; + return v / microseconds(1000); } -prefix_ senf::ClockService::clock_type senf::ClockService::now_i() +prefix_ senf::ClockService::clock_type senf::ClockService::in_seconds(int64_type v) { - boost::posix_time::ptime time (boost::posix_time::microsec_clock::universal_time()); - if (checkSkew(time)) - updateSkew(time); - return clock(time); + return v / milliseconds(1000); } -prefix_ bool senf::ClockService::checkSkew(boost::posix_time::ptime time) +prefix_ senf::ClockService::clock_type senf::ClockService::in_minutes(int64_type v) { - return time < heartbeat_ || (time - heartbeat_) > boost::posix_time::seconds(2*CheckInterval); + return v / seconds(60); } -prefix_ void senf::ClockService::clockSkew(boost::posix_time::ptime time, - boost::posix_time::ptime expected) +prefix_ senf::ClockService::clock_type senf::ClockService::in_hours(int64_type v) +{ + return v / minutes(60); +} + +prefix_ senf::ClockService::clock_type senf::ClockService::in_days(int64_type v) +{ + return v / hours(24); +} + +prefix_ senf::ClockService::clock_type senf::ClockService::from_timeval(timeval const & time) +{ + return from_time_t(time.tv_sec) + ClockService::microseconds(time.tv_usec); +} + +prefix_ void senf::ClockService::restart() { - base_ += (time - expected); + instance().restart_m(); } ///////////////////////////////cci.e///////////////////////////////////////