X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Scheduler%2FClockService.hh;h=e0e39395341851f5f71c5aa2c47661dd6f4ee15e;hb=f2cc6f8a4ca99301f9f26156803e541ec2dff66b;hp=21a15eb91f0804b673658d5a735194ae57f94719;hpb=e8b91aa6a817af6d9a3714e7b66be6c0d6b0a4e5;p=senf.git diff --git a/Scheduler/ClockService.hh b/Scheduler/ClockService.hh index 21a15eb..e0e3939 100644 --- a/Scheduler/ClockService.hh +++ b/Scheduler/ClockService.hh @@ -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 @@ -27,10 +27,11 @@ #define HH_ClockService_ 1 // Custom includes +#include #include #include #include -#include "Utils/singleton.hh" +#include "../Utils/singleton.hh" //#include "ClockService.mpp" ///////////////////////////////hh.p//////////////////////////////////////// @@ -83,6 +84,13 @@ namespace senf { in the normal case (no clock skew) and still encapsulate the dependency on legacy C headers. Using the senf::singleton mixin ensures, that the instance is constructed before main even when instance() is not called. + + \bug There is a deadlock condition between ClockService and the streaming of Boost.DateTime + values: Boost.DateTime seems to call tzset() whenever writing a date/time value (ugh) + and since tzset changes basic date/time values, it seems to block gettimeofday() which + leads to the SIGLARM handler blocking indefinitely. Resolution either a) find out, why + tzset() of all functions is called or b) move the ClockService heartbeat functionality + into the Scheduler. */ class ClockService : singleton @@ -97,6 +105,7 @@ namespace senf { nanoseconds relative to some implementation defined reference time. */ typedef boost::int_fast64_t clock_type; + typedef boost::int_fast64_t int64_type; /** \brief Absolute time data type @@ -130,13 +139,31 @@ namespace senf { corresponding clock value. \see abstime */ - static clock_type nanoseconds(clock_type v); - static clock_type microseconds(clock_type v); - static clock_type milliseconds(clock_type v); - static clock_type seconds(clock_type v); - static clock_type minutes(clock_type v); - static clock_type hours(clock_type v); - static clock_type days(clock_type v); + static clock_type from_time_t(time_t const & time); + ///< Convert legacy time_t to clock value + /**< This member converts an absolute time value + represented as a time_t value into a clock value */ + + static clock_type from_timeval(timeval const & time); + ///< Convert legacy timeval to clock value + /**< This member converts an absolute time value + represented as a timeval value into a clock value */ + + static clock_type nanoseconds(int64_type v); ///< Convert \a v nanoseconds to clock_type + static clock_type microseconds(int64_type v); ///< Convert \a v microseconds to clock_type + static clock_type milliseconds(int64_type v); ///< Convert \a v milliseconds to clock_type + static clock_type seconds(int64_type v); ///< Convert \a v seconds to clock_type + static clock_type minutes(int64_type v); ///< Convert \a v minutes to clock_type + static clock_type hours(int64_type v); ///< Convert \a v hours to clock_type + static clock_type days(int64_type v); ///< Convert \a v days to clock_type + + static int64_type in_nanoseconds(clock_type v); ///< Convert \a v to nanoseconds + static int64_type in_microseconds(clock_type v); ///< Convert \a v to microseconds + static int64_type in_milliseconds(clock_type v); ///< Convert \a v to milliseconds + static int64_type in_seconds(clock_type v); ///< Convert \a v to seconds + static int64_type in_minutes(clock_type v); ///< Convert \a v to minutes + static int64_type in_hours(clock_type v); ///< Convert \a v to hours + static int64_type in_days(clock_type v); ///< Convert \a v to days static void restart(); @@ -154,10 +181,13 @@ namespace senf { 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_; // I don't want this header to depend on the legacy C headers. + /// Internal: ClockService private data (PIMPL idiom) struct Impl; boost::scoped_ptr impl_;