From 5b2545bf2437629586bdfe43c86cb3089b2681e8 Mon Sep 17 00:00:00 2001 From: Corentin Wallez Date: Thu, 21 May 2015 15:26:15 -0400 Subject: [PATCH] Correct LinuxTimer time calculations Changes to CLOCK_MONOTONIC as CLOCK_PROCESS_CPUTIME counts only user time and not kernel time. BUG=angleproject:892 Change-Id: I3d5aee26ee2bacd7449fdd7795ad8c2b289d7324 Reviewed-on: https://chromium-review.googlesource.com/272652 Reviewed-by: Jamie Madill Reviewed-by: Geoff Lang Tested-by: Corentin Wallez --- util/linux/LinuxTimer.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/util/linux/LinuxTimer.cpp b/util/linux/LinuxTimer.cpp index 66aba36e3..196820580 100644 --- a/util/linux/LinuxTimer.cpp +++ b/util/linux/LinuxTimer.cpp @@ -7,6 +7,7 @@ // LinuxTimer.cpp: Implementation of a high precision timer class on Linux #include "linux/LinuxTimer.h" +#include LinuxTimer::LinuxTimer() : mRunning(false) @@ -15,13 +16,13 @@ LinuxTimer::LinuxTimer() void LinuxTimer::start() { - clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &mStartTime); + clock_gettime(CLOCK_MONOTONIC, &mStartTime); mRunning = true; } void LinuxTimer::stop() { - clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &mStopTime); + clock_gettime(CLOCK_MONOTONIC, &mStopTime); mRunning = false; } @@ -30,14 +31,16 @@ double LinuxTimer::getElapsedTime() const struct timespec endTime; if (mRunning) { - clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &endTime); + clock_gettime(CLOCK_MONOTONIC, &endTime); } else { endTime = mStopTime; } - return endTime.tv_sec + (1.0 / 1000000000) * endTime.tv_nsec; + double startSeconds = mStartTime.tv_sec + (1.0 / 1000000000) * mStartTime.tv_nsec; + double endSeconds = endTime.tv_sec + (1.0 / 1000000000) * endTime.tv_nsec; + return endSeconds - startSeconds; } Timer *CreateTimer()