From 5d6586636ec3027480862eea0963389c3ce4024e Mon Sep 17 00:00:00 2001 From: Danny Robson Date: Thu, 23 Jul 2015 14:13:09 +1000 Subject: [PATCH] time: split off platform units --- Makefile.am | 6 ++-- time.cpp | 81 ++++++++++++++------------------------------------ time_posix.cpp | 52 ++++++++++++++++++++++++++++++++ time_win32.cpp | 47 +++++++++++++++++++++++++++++ 4 files changed, 126 insertions(+), 60 deletions(-) create mode 100644 time_posix.cpp create mode 100644 time_win32.cpp diff --git a/Makefile.am b/Makefile.am index d34e2e16..e3019d9a 100644 --- a/Makefile.am +++ b/Makefile.am @@ -256,13 +256,15 @@ if PLATFORM_LINUX UTIL_FILES += \ backtrace_execinfo.cpp \ io_posix.cpp \ - io_posix.hpp + io_posix.hpp \ + time_posix.cpp endif if PLATFORM_WIN32 UTIL_FILES += \ backtrace_null.cpp \ - io_win32.cpp + io_win32.cpp \ + time_win32.cpp endif ############################################################################### diff --git a/time.cpp b/time.cpp index f90bc1d4..6d289407 100644 --- a/time.cpp +++ b/time.cpp @@ -24,80 +24,40 @@ using namespace util; -// ---------------------------------------------------------------------------- -static const uint64_t SECOND = 1000000000UL; -static const uint64_t MILLISECOND = 1000000UL; - -// ---------------------------------------------------------------------------- -#ifdef PLATFORM_WIN32 -#include - -uint64_t -util::nanoseconds (void) { - LARGE_INTEGER freq, count; - QueryPerformanceFrequency (&freq); - QueryPerformanceCounter (&count); - - return ((double)count.QuadPart / freq.QuadPart) * SECOND; -} +/////////////////////////////////////////////////////////////////////////////// +static const uint64_t SECOND = 1'000'000'000UL; +static const uint64_t MILLISECOND = 1'000'000UL; -void -util::sleep (uint64_t ns) { - Sleep (ns / MILLISECOND); -} - -#else -#include - -uint64_t -util::nanoseconds (void) { - struct timespec t; - clock_gettime (CLOCK_MONOTONIC, &t); - - CHECK_GT (t.tv_sec, 0); - CHECK_GT (t.tv_nsec, 0); - - return static_cast (t.tv_sec) * SECOND + static_cast (t.tv_nsec); -} - - -void -util::sleep (uint64_t ns) { - struct timespec req, rem; - - req.tv_sec = sign_cast (ns / SECOND); - req.tv_nsec = sign_cast (ns % SECOND); - - while (nanosleep (&req, &rem)) { - req = rem; - } -} -#endif - -// ---------------------------------------------------------------------------- +/////////////////////////////////////////////////////////////////////////////// delta_clock::delta_clock (): time { util::nanoseconds (), util::nanoseconds () } { ; } +//----------------------------------------------------------------------------- float -delta_clock::seconds (void) { +delta_clock::seconds (void) +{ time.prev = time.curr; time.curr = nanoseconds (); return (time.curr - time.prev) / static_cast (SECOND); } -// ---------------------------------------------------------------------------- -util::period_query::period_query (float seconds) { + +/////////////////////////////////////////////////////////////////////////////// +util::period_query::period_query (float seconds) +{ m_time.start = nanoseconds (); m_time.period = static_cast (seconds * SECOND); } +//----------------------------------------------------------------------------- bool -util::period_query::poll (void) { +util::period_query::poll (void) +{ uint64_t now = nanoseconds (); uint64_t diff = now - m_time.start; if (diff < m_time.period) @@ -108,15 +68,17 @@ util::period_query::poll (void) { } -// ---------------------------------------------------------------------------- +/////////////////////////////////////////////////////////////////////////////// util::rate_limiter::rate_limiter (unsigned rate): m_last (nanoseconds ()), m_target (SECOND / rate) { ; } +//----------------------------------------------------------------------------- void -util::rate_limiter::poll (void) { +util::rate_limiter::poll (void) +{ uint64_t now = nanoseconds (); uint64_t total = now - m_last; @@ -127,7 +89,7 @@ util::rate_limiter::poll (void) { } -// ---------------------------------------------------------------------------- +/////////////////////////////////////////////////////////////////////////////// util::polled_duration::polled_duration (std::string name, uint64_t interval): m_name (name), m_interval (interval), @@ -135,12 +97,15 @@ util::polled_duration::polled_duration (std::string name, uint64_t interval): { ; } +//----------------------------------------------------------------------------- void -util::polled_duration::start (void) { +util::polled_duration::start (void) +{ m_last = nanoseconds (); } +//----------------------------------------------------------------------------- void util::polled_duration::stop (void) { uint64_t now = nanoseconds (); diff --git a/time_posix.cpp b/time_posix.cpp new file mode 100644 index 00000000..92e8cd44 --- /dev/null +++ b/time_posix.cpp @@ -0,0 +1,52 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Copyright 2010 Danny Robson + */ + +#include "time.hpp" + +#include "types/casts.hpp" + +#include + +static const uint64_t SECOND = 1'000'000'000UL; +static const uint64_t MILLISECOND = 1'000'000UL; + +/////////////////////////////////////////////////////////////////////////////// +uint64_t +util::nanoseconds (void) +{ + struct timespec t; + clock_gettime (CLOCK_MONOTONIC, &t); + + CHECK_GT (t.tv_sec, 0); + CHECK_GT (t.tv_nsec, 0); + + return static_cast (t.tv_sec) * SECOND + static_cast (t.tv_nsec); +} + + +/////////////////////////////////////////////////////////////////////////////// +void +util::sleep (uint64_t ns) +{ + struct timespec req, rem; + + req.tv_sec = sign_cast (ns / SECOND); + req.tv_nsec = sign_cast (ns % SECOND); + + while (nanosleep (&req, &rem)) { + req = rem; + } +} diff --git a/time_win32.cpp b/time_win32.cpp new file mode 100644 index 00000000..93a11733 --- /dev/null +++ b/time_win32.cpp @@ -0,0 +1,47 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Copyright 2010 Danny Robson + */ + +#include "time.hpp" + +#include "platform.hpp" + +#if !defined(PLATFORM_WIN32) +#error +#endif + +#include + +static const uint64_t SECOND = 1'000'000'000UL; +static const uint64_t MILLISECOND = 1'000'000UL; + +/////////////////////////////////////////////////////////////////////////////// +uint64_t +util::nanoseconds (void) +{ + LARGE_INTEGER freq, count; + QueryPerformanceFrequency (&freq); + QueryPerformanceCounter (&count); + + return count.QuadPart * SECOND / freq.QuadPart; +} + + +/////////////////////////////////////////////////////////////////////////////// +void +util::sleep (uint64_t ns) +{ + Sleep (ns / MILLISECOND); +}