diff --git a/beast/chrono/RelativeTime.h b/beast/chrono/RelativeTime.h index 54da15daa..fbd60d3a3 100644 --- a/beast/chrono/RelativeTime.h +++ b/beast/chrono/RelativeTime.h @@ -60,6 +60,9 @@ public: /** Destructor. */ ~RelativeTime() noexcept; + /** Returns the amount of time since the process was started. */ + static RelativeTime fromStartup (); + //============================================================================== /** Creates a new RelativeTime object representing a number of milliseconds. @see seconds, minutes, hours, days, weeks @@ -145,41 +148,44 @@ public: String getDescription (const String& returnValueForZeroTime = "0") const; std::string to_string () const; - //============================================================================== + RelativeTime operator+ (double seconds) const noexcept + { return RelativeTime (numSeconds + seconds); } + + RelativeTime operator- (double seconds) const noexcept + { return RelativeTime (numSeconds - seconds); } + /** Adds another RelativeTime to this one. */ RelativeTime operator+= (RelativeTime timeToAdd) noexcept; + /** Subtracts another RelativeTime from this one. */ RelativeTime operator-= (RelativeTime timeToSubtract) noexcept; /** Adds a number of seconds to this time. */ RelativeTime operator+= (double secondsToAdd) noexcept; + /** Subtracts a number of seconds from this time. */ RelativeTime operator-= (double secondsToSubtract) noexcept; private: - //============================================================================== double numSeconds; }; -//============================================================================== -/** Compares two RelativeTimes. */ +//------------------------------------------------------------------------------ + bool operator== (RelativeTime t1, RelativeTime t2) noexcept; -/** Compares two RelativeTimes. */ bool operator!= (RelativeTime t1, RelativeTime t2) noexcept; -/** Compares two RelativeTimes. */ bool operator> (RelativeTime t1, RelativeTime t2) noexcept; -/** Compares two RelativeTimes. */ bool operator< (RelativeTime t1, RelativeTime t2) noexcept; -/** Compares two RelativeTimes. */ bool operator>= (RelativeTime t1, RelativeTime t2) noexcept; -/** Compares two RelativeTimes. */ bool operator<= (RelativeTime t1, RelativeTime t2) noexcept; -//============================================================================== +//------------------------------------------------------------------------------ + /** Adds two RelativeTimes together. */ -RelativeTime operator+ (RelativeTime t1, RelativeTime t2) noexcept; +RelativeTime operator+ (RelativeTime t1, RelativeTime t2) noexcept; + /** Subtracts two RelativeTimes. */ -RelativeTime operator- (RelativeTime t1, RelativeTime t2) noexcept; +RelativeTime operator- (RelativeTime t1, RelativeTime t2) noexcept; inline std::ostream& operator<< (std::ostream& os, RelativeTime const& diff) { @@ -190,4 +196,3 @@ inline std::ostream& operator<< (std::ostream& os, RelativeTime const& diff) } #endif - diff --git a/beast/chrono/impl/RelativeTime.cpp b/beast/chrono/impl/RelativeTime.cpp index ac78d3994..97736945a 100644 --- a/beast/chrono/impl/RelativeTime.cpp +++ b/beast/chrono/impl/RelativeTime.cpp @@ -256,3 +256,71 @@ std::string RelativeTime::to_string () const } } + +#if BEAST_WINDOWS + +#include + +namespace beast { + +RelativeTime RelativeTime::fromStartup () +{ + ULONGLONG ticks (GetTickCount64()); + + return RelativeTime (ticks / 1000.0); +} + +} + +#else + +#include + +namespace beast { + +namespace detail { + +// Converts a timespec to a RelativeTme +static RelativeTime toRelativeTime (timespec const& ts) +{ + return RelativeTime (ts.tv_sec + + ts.tv_nsec / 1000000000.0); +} + +// Records and returns the time from process startup +static RelativeTime getStartupTime() +{ + struct StartupTime + { + StartupTime () + { clock_gettime (CLOCK_MONOTONIC, &ts); } + timespec ts; + }; + + static StartupTime startupTime; + + return toRelativeTime (startupTime.ts); +} + +// Used to call getStartupTime as early as possible +struct StartupTimeStaticInitializer +{ + StartupTimeStaticInitializer () + { getStartupTime(); } +}; + +static StartupTimeStaticInitializer startupTimeStaticInitializer; + +} + +RelativeTime RelativeTime::fromStartup () +{ + timespec ts; + clock_gettime (CLOCK_MONOTONIC, &ts); + + return detail::toRelativeTime (ts) - detail::getStartupTime(); +} + +} + +#endif