Commit e3c3f91c authored by Gabi Melman's avatar Gabi Melman

Merge pull request #153 from ksergey/clock_tweak

Added CLOCK_MONOTONIC trick
parents 01f3d6f5 9e8c8c11
...@@ -35,6 +35,20 @@ namespace details ...@@ -35,6 +35,20 @@ namespace details
namespace os namespace os
{ {
#if defined __linux__ && defined SPDLOG_CLOCK_MONOTONIC
inline uint64_t clock_offset()
{
timespec ts_realtime;
::clock_gettime(CLOCK_REALTIME, &ts_realtime);
timespec ts_monotonic;
::clock_gettime(CLOCK_MONOTONIC, &ts_monotonic);
const uint64_t realtime = ts_realtime.tv_sec * 1000000000 + ts_realtime.tv_nsec;
const uint64_t monotonic = ts_monotonic.tv_sec * 1000000000 + ts_monotonic.tv_nsec;
return realtime - monotonic;
}
#endif
inline spdlog::log_clock::time_point now() inline spdlog::log_clock::time_point now()
{ {
...@@ -45,6 +59,14 @@ inline spdlog::log_clock::time_point now() ...@@ -45,6 +59,14 @@ inline spdlog::log_clock::time_point now()
std::chrono::duration_cast<typename log_clock::duration>( std::chrono::duration_cast<typename log_clock::duration>(
std::chrono::seconds(ts.tv_sec) + std::chrono::nanoseconds(ts.tv_nsec))); std::chrono::seconds(ts.tv_sec) + std::chrono::nanoseconds(ts.tv_nsec)));
#elif defined __linux__ && defined SPDLOG_CLOCK_MONOTONIC
static const auto offset = std::chrono::nanoseconds(clock_offset());
timespec ts;
::clock_gettime(CLOCK_MONOTONIC, &ts);
return std::chrono::time_point<log_clock, typename log_clock::duration>(
std::chrono::duration_cast<typename log_clock::duration>(
offset + std::chrono::seconds(ts.tv_sec) + std::chrono::nanoseconds(ts.tv_nsec)));
#else #else
return log_clock::now(); return log_clock::now();
#endif #endif
...@@ -151,7 +173,7 @@ inline bool file_exists(const std::string& filename) ...@@ -151,7 +173,7 @@ inline bool file_exists(const std::string& filename)
#elif __linux__ #elif __linux__
struct stat buffer; struct stat buffer;
return (stat (filename.c_str(), &buffer) == 0); return (stat (filename.c_str(), &buffer) == 0);
#else #else
auto *file = fopen(filename.c_str(), "r"); auto *file = fopen(filename.c_str(), "r");
if (file != nullptr) if (file != nullptr)
{ {
......
...@@ -17,6 +17,14 @@ ...@@ -17,6 +17,14 @@
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// Under Linux, the much faster CLOCK_MONOTONIC clock can be used.
// This clock is more accurate than CLOCK_REALTIME_COARSE and faster than regular clock.
// Uncomment to use it instead of the regular clock.
// #define SPDLOG_CLOCK_MONOTONIC
///////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
// Uncomment if date/time logging is not needed. // Uncomment if date/time logging is not needed.
// This will prevent spdlog from quering the clock on each log call. // This will prevent spdlog from quering the clock on each log call.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment