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#include <utils/Timers.h> 21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Log.h> 22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdlib.h> 24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdio.h> 25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <unistd.h> 26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/time.h> 27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <time.h> 28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <errno.h> 29c0a5e8df03d949cb307a0eb98f0222086c0434c1Jeff Brown#include <limits.h> 30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifdef HAVE_WIN32_THREADS 32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <windows.h> 33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnsecs_t systemTime(int clock) 36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if defined(HAVE_POSIX_CLOCKS) 38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static const clockid_t clocks[] = { 39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project CLOCK_REALTIME, 40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project CLOCK_MONOTONIC, 41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project CLOCK_PROCESS_CPUTIME_ID, 42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project CLOCK_THREAD_CPUTIME_ID 43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project }; 44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project struct timespec t; 45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project t.tv_sec = t.tv_nsec = 0; 46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project clock_gettime(clocks[clock], &t); 47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return nsecs_t(t.tv_sec)*1000000000LL + t.tv_nsec; 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#else 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // we don't support the clocks here. 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project struct timeval t; 51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project t.tv_sec = t.tv_usec = 0; 52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gettimeofday(&t, NULL); 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return nsecs_t(t.tv_sec)*1000000000LL + nsecs_t(t.tv_usec)*1000LL; 54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 57c0a5e8df03d949cb307a0eb98f0222086c0434c1Jeff Brownint toMillisecondTimeoutDelay(nsecs_t referenceTime, nsecs_t timeoutTime) 58c0a5e8df03d949cb307a0eb98f0222086c0434c1Jeff Brown{ 59c0a5e8df03d949cb307a0eb98f0222086c0434c1Jeff Brown int timeoutDelayMillis; 60c0a5e8df03d949cb307a0eb98f0222086c0434c1Jeff Brown if (timeoutTime > referenceTime) { 61c0a5e8df03d949cb307a0eb98f0222086c0434c1Jeff Brown uint64_t timeoutDelay = uint64_t(timeoutTime - referenceTime); 62c0a5e8df03d949cb307a0eb98f0222086c0434c1Jeff Brown if (timeoutDelay > uint64_t((INT_MAX - 1) * 1000000LL)) { 63c0a5e8df03d949cb307a0eb98f0222086c0434c1Jeff Brown timeoutDelayMillis = -1; 64c0a5e8df03d949cb307a0eb98f0222086c0434c1Jeff Brown } else { 65c0a5e8df03d949cb307a0eb98f0222086c0434c1Jeff Brown timeoutDelayMillis = (timeoutDelay + 999999LL) / 1000000LL; 66c0a5e8df03d949cb307a0eb98f0222086c0434c1Jeff Brown } 67c0a5e8df03d949cb307a0eb98f0222086c0434c1Jeff Brown } else { 68c0a5e8df03d949cb307a0eb98f0222086c0434c1Jeff Brown timeoutDelayMillis = 0; 69c0a5e8df03d949cb307a0eb98f0222086c0434c1Jeff Brown } 70c0a5e8df03d949cb307a0eb98f0222086c0434c1Jeff Brown return timeoutDelayMillis; 71c0a5e8df03d949cb307a0eb98f0222086c0434c1Jeff Brown} 72c0a5e8df03d949cb307a0eb98f0222086c0434c1Jeff Brown 73c0a5e8df03d949cb307a0eb98f0222086c0434c1Jeff Brown 74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * =========================================================================== 76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * DurationTimer 77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * =========================================================================== 78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace android; 81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// Start the timer. 83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid DurationTimer::start(void) 84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gettimeofday(&mStartWhen, NULL); 86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// Stop the timer. 89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid DurationTimer::stop(void) 90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gettimeofday(&mStopWhen, NULL); 92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// Get the duration in microseconds. 95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectlong long DurationTimer::durationUsecs(void) const 96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (long) subtractTimevals(&mStopWhen, &mStartWhen); 98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// Subtract two timevals. Returns the difference (ptv1-ptv2) in 101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// microseconds. 102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*static*/ long long DurationTimer::subtractTimevals(const struct timeval* ptv1, 103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const struct timeval* ptv2) 104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project long long stop = ((long long) ptv1->tv_sec) * 1000000LL + 106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ((long long) ptv1->tv_usec); 107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project long long start = ((long long) ptv2->tv_sec) * 1000000LL + 108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ((long long) ptv2->tv_usec); 109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return stop - start; 110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// Add the specified amount of time to the timeval. 113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*static*/ void DurationTimer::addToTimeval(struct timeval* ptv, long usec) 114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (usec < 0) { 1169f760150f6e0f39b9923cfdc875373606839ee00Steve Block ALOG(LOG_WARN, "", "Negative values not supported in addToTimeval\n"); 117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // normalize tv_usec if necessary 121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ptv->tv_usec >= 1000000) { 122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ptv->tv_sec += ptv->tv_usec / 1000000; 123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ptv->tv_usec %= 1000000; 124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ptv->tv_usec += usec % 1000000; 127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ptv->tv_usec >= 1000000) { 128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ptv->tv_usec -= 1000000; 129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ptv->tv_sec++; 130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ptv->tv_sec += usec / 1000000; 132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 134