1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
79ac68ee2594f28dfc1bd16a4bf004b1a4f6f228dmtklein#include "SysTimer_posix.h"
8be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com
99ac68ee2594f28dfc1bd16a4bf004b1a4f6f228dmtkleinstatic double interval_in_ms(timespec start_clock, timespec end_clock)
10be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com{
11be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com    double duration_clock;
12be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com    if ((end_clock.tv_nsec - start_clock.tv_nsec) < 0) {
139ac68ee2594f28dfc1bd16a4bf004b1a4f6f228dmtklein        duration_clock = (end_clock.tv_sec - start_clock.tv_sec - 1) * 1000;
149ac68ee2594f28dfc1bd16a4bf004b1a4f6f228dmtklein        duration_clock += (1000000000 + end_clock.tv_nsec - start_clock.tv_nsec) / 1000000.0;
15be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com    } else {
169ac68ee2594f28dfc1bd16a4bf004b1a4f6f228dmtklein        duration_clock = (end_clock.tv_sec - start_clock.tv_sec) * 1000;
17be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com        duration_clock += (end_clock.tv_nsec - start_clock.tv_nsec) / 1000000.0;
18be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com    }
19be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com    return duration_clock;
20be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com}
21be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com
229ac68ee2594f28dfc1bd16a4bf004b1a4f6f228dmtkleinvoid SysTimer::startWall() {
239ac68ee2594f28dfc1bd16a4bf004b1a4f6f228dmtklein    if (-1 == clock_gettime(CLOCK_MONOTONIC, &fWall)) {
24be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com        timespec none = {0, 0};
259ac68ee2594f28dfc1bd16a4bf004b1a4f6f228dmtklein        fWall = none;
26be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com    }
27be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com}
289ac68ee2594f28dfc1bd16a4bf004b1a4f6f228dmtkleinvoid SysTimer::startCpu() {
299ac68ee2594f28dfc1bd16a4bf004b1a4f6f228dmtklein    if (-1 == clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &fCpu)) {
30be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com        timespec none = {0, 0};
319ac68ee2594f28dfc1bd16a4bf004b1a4f6f228dmtklein        fCpu = none;
32be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com    }
33be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com}
34be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com
359ac68ee2594f28dfc1bd16a4bf004b1a4f6f228dmtkleindouble SysTimer::endCpu() {
36be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com    timespec end_cpu;
37be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com    if (-1 == clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &end_cpu)) {
38be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com        timespec none = {0, 0};
39be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com        end_cpu = none;
40be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com    }
419ac68ee2594f28dfc1bd16a4bf004b1a4f6f228dmtklein    return interval_in_ms(fCpu, end_cpu);
42be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com}
43be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com
449ac68ee2594f28dfc1bd16a4bf004b1a4f6f228dmtkleindouble SysTimer::endWall() {
45be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com    timespec end_wall;
46be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com    if (-1 == clock_gettime(CLOCK_MONOTONIC, &end_wall)) {
47be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com        timespec none = {0, 0};
48be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com        end_wall = none;
49be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com    }
509ac68ee2594f28dfc1bd16a4bf004b1a4f6f228dmtklein    return interval_in_ms(fWall, end_wall);
51be9ad4e5fc6126a1273a7dccf1a85db72e763df3bungeman@google.com}
52