1cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project/*
2cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
3cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project *
4cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * you may not use this file except in compliance with the License.
6cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * You may obtain a copy of the License at
7cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project *
8cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project *
10cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * See the License for the specific language governing permissions and
14cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * limitations under the License.
15cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project */
16cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
17cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
18cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project/*
19cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * System clock functions.
20cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project */
21cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
2222dbf3947fedf988e714a4703ddf85fc41413f90Mathias Agopian#define LOG_TAG "SystemClock"
2322dbf3947fedf988e714a4703ddf85fc41413f90Mathias Agopian
2422dbf3947fedf988e714a4703ddf85fc41413f90Mathias Agopian#include <utils/SystemClock.h>
2522dbf3947fedf988e714a4703ddf85fc41413f90Mathias Agopian
26cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#include <sys/time.h>
27cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#include <string.h>
28e94c92cd4852698c5ea2cab2e2f5686ec3708f36Greg Hackmann#include <errno.h>
29cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
30e94c92cd4852698c5ea2cab2e2f5686ec3708f36Greg Hackmann#include <cutils/compiler.h>
31cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
3222dbf3947fedf988e714a4703ddf85fc41413f90Mathias Agopian#include <utils/Timers.h>
339eb2a3b1c0cc1ff3082a9283e24c8babc112f56bMathias Agopian#include <utils/Log.h>
34cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
35cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectnamespace android {
36cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
37cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project/*
38cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * native public static long uptimeMillis();
39cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project */
40cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectint64_t uptimeMillis()
41cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{
42cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    int64_t when = systemTime(SYSTEM_TIME_MONOTONIC);
43cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    return (int64_t) nanoseconds_to_milliseconds(when);
44cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}
45cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
46cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project/*
47cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * native public static long elapsedRealtime();
48cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project */
49cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectint64_t elapsedRealtime()
50cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{
51af1e7b77217430cc2d423e9f552dcfb4e004539bNick Pelly	return nanoseconds_to_milliseconds(elapsedRealtimeNano());
52af1e7b77217430cc2d423e9f552dcfb4e004539bNick Pelly}
53af1e7b77217430cc2d423e9f552dcfb4e004539bNick Pelly
54af1e7b77217430cc2d423e9f552dcfb4e004539bNick Pelly/*
55af1e7b77217430cc2d423e9f552dcfb4e004539bNick Pelly * native public static long elapsedRealtimeNano();
56af1e7b77217430cc2d423e9f552dcfb4e004539bNick Pelly */
57af1e7b77217430cc2d423e9f552dcfb4e004539bNick Pellyint64_t elapsedRealtimeNano()
58af1e7b77217430cc2d423e9f552dcfb4e004539bNick Pelly{
59e94c92cd4852698c5ea2cab2e2f5686ec3708f36Greg Hackmann#if defined(__linux__)
60ad19af71326c755dac609451a257cbad830f55fdElliott Hughes    struct timespec ts;
61e94c92cd4852698c5ea2cab2e2f5686ec3708f36Greg Hackmann    int err = clock_gettime(CLOCK_BOOTTIME, &ts);
62e94c92cd4852698c5ea2cab2e2f5686ec3708f36Greg Hackmann    if (CC_UNLIKELY(err)) {
63e94c92cd4852698c5ea2cab2e2f5686ec3708f36Greg Hackmann        // This should never happen, but just in case ...
64e94c92cd4852698c5ea2cab2e2f5686ec3708f36Greg Hackmann        ALOGE("clock_gettime(CLOCK_BOOTTIME) failed: %s", strerror(errno));
65e94c92cd4852698c5ea2cab2e2f5686ec3708f36Greg Hackmann        return 0;
6664289760a2df9409d8f4fa5becb4a49f0acb20a5Greg Hackmann    }
6764289760a2df9409d8f4fa5becb4a49f0acb20a5Greg Hackmann
68e94c92cd4852698c5ea2cab2e2f5686ec3708f36Greg Hackmann    return seconds_to_nanoseconds(ts.tv_sec) + ts.tv_nsec;
69cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#else
70af1e7b77217430cc2d423e9f552dcfb4e004539bNick Pelly    return systemTime(SYSTEM_TIME_MONOTONIC);
71cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#endif
72cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}
73cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
74cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}; // namespace android
75