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