1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2005 The Android Open Source Project 3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License. 6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at 7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and 14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License. 15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// 18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// Timer functions. 19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// 20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifndef _LIBS_UTILS_TIMERS_H 21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define _LIBS_UTILS_TIMERS_H 22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdint.h> 24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h> 25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/time.h> 26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ------------------------------------------------------------------ 28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// C API 29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifdef __cplusplus 31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectextern "C" { 32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttypedef int64_t nsecs_t; // nano-seconds 35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic inline nsecs_t seconds_to_nanoseconds(nsecs_t secs) 37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return secs*1000000000; 39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic inline nsecs_t milliseconds_to_nanoseconds(nsecs_t secs) 42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return secs*1000000; 44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic inline nsecs_t microseconds_to_nanoseconds(nsecs_t secs) 47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return secs*1000; 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic inline nsecs_t nanoseconds_to_seconds(nsecs_t secs) 52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return secs/1000000000; 54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic inline nsecs_t nanoseconds_to_milliseconds(nsecs_t secs) 57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return secs/1000000; 59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic inline nsecs_t nanoseconds_to_microseconds(nsecs_t secs) 62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return secs/1000; 64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic inline nsecs_t s2ns(nsecs_t v) {return seconds_to_nanoseconds(v);} 67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic inline nsecs_t ms2ns(nsecs_t v) {return milliseconds_to_nanoseconds(v);} 68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic inline nsecs_t us2ns(nsecs_t v) {return microseconds_to_nanoseconds(v);} 69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic inline nsecs_t ns2s(nsecs_t v) {return nanoseconds_to_seconds(v);} 70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic inline nsecs_t ns2ms(nsecs_t v) {return nanoseconds_to_milliseconds(v);} 71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic inline nsecs_t ns2us(nsecs_t v) {return nanoseconds_to_microseconds(v);} 72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic inline nsecs_t seconds(nsecs_t v) { return s2ns(v); } 74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic inline nsecs_t milliseconds(nsecs_t v) { return ms2ns(v); } 75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic inline nsecs_t microseconds(nsecs_t v) { return us2ns(v); } 76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectenum { 78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project SYSTEM_TIME_REALTIME = 0, // system-wide realtime clock 79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project SYSTEM_TIME_MONOTONIC = 1, // monotonic time since unspecified starting point 80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project SYSTEM_TIME_PROCESS = 2, // high-resolution per-process clock 81074cd0c0765d1aec5a4ff5ac460f0685ae067fb1Nick Pelly SYSTEM_TIME_THREAD = 3, // high-resolution per-thread clock 82074cd0c0765d1aec5a4ff5ac460f0685ae067fb1Nick Pelly SYSTEM_TIME_BOOTTIME = 4 // same as SYSTEM_TIME_MONOTONIC, but including CPU suspend time 83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 84074cd0c0765d1aec5a4ff5ac460f0685ae067fb1Nick Pelly 85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// return the system-time according to the specified clock 86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifdef __cplusplus 87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnsecs_t systemTime(int clock = SYSTEM_TIME_MONOTONIC); 88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#else 89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnsecs_t systemTime(int clock); 90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif // def __cplusplus 91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 92c0a5e8df03d949cb307a0eb98f0222086c0434c1Jeff Brown/** 93c0a5e8df03d949cb307a0eb98f0222086c0434c1Jeff Brown * Returns the number of milliseconds to wait between the reference time and the timeout time. 94c0a5e8df03d949cb307a0eb98f0222086c0434c1Jeff Brown * If the timeout is in the past relative to the reference time, returns 0. 95c0a5e8df03d949cb307a0eb98f0222086c0434c1Jeff Brown * If the timeout is more than INT_MAX milliseconds in the future relative to the reference time, 96c0a5e8df03d949cb307a0eb98f0222086c0434c1Jeff Brown * such as when timeoutTime == LLONG_MAX, returns -1 to indicate an infinite timeout delay. 97c0a5e8df03d949cb307a0eb98f0222086c0434c1Jeff Brown * Otherwise, returns the difference between the reference time and timeout time 98c0a5e8df03d949cb307a0eb98f0222086c0434c1Jeff Brown * rounded up to the next millisecond. 99c0a5e8df03d949cb307a0eb98f0222086c0434c1Jeff Brown */ 100c0a5e8df03d949cb307a0eb98f0222086c0434c1Jeff Brownint toMillisecondTimeoutDelay(nsecs_t referenceTime, nsecs_t timeoutTime); 101c0a5e8df03d949cb307a0eb98f0222086c0434c1Jeff Brown 102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifdef __cplusplus 103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} // extern "C" 104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ------------------------------------------------------------------ 107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// C++ API 108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifdef __cplusplus 110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Time the duration of something. 114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Includes some timeval manipulation functions. 116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass DurationTimer { 118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic: 11983c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian DurationTimer() {} 12083c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian ~DurationTimer() {} 121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Start the timer. 12383c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian void start(); 124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Stop the timer. 12583c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian void stop(); 126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Get the duration in microseconds. 12783c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian long long durationUsecs() const; 128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Subtract two timevals. Returns the difference (ptv1-ptv2) in 130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // microseconds. 131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static long long subtractTimevals(const struct timeval* ptv1, 132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const struct timeval* ptv2); 133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Add the specified amount of time to the timeval. 135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static void addToTimeval(struct timeval* ptv, long usec); 136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate: 138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project struct timeval mStartWhen; 139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project struct timeval mStopWhen; 140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // android 143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif // def __cplusplus 144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif // _LIBS_UTILS_TIMERS_H 146