Add elapsedRealtimeNano(), and use CLOCK_BOOTTIME where possible.

Change-Id: I4231c8ca32663e6e2cb5b7c126d091f837373807
This commit is contained in:
Nick Pelly 2012-07-19 09:17:24 -07:00
parent df5cbd7622
commit 074cd0c076
4 changed files with 30 additions and 17 deletions

View File

@ -25,6 +25,7 @@ namespace android {
int setCurrentTimeMillis(int64_t millis);
int64_t uptimeMillis();
int64_t elapsedRealtime();
int64_t elapsedRealtimeNano();
}; // namespace android

View File

@ -78,9 +78,10 @@ enum {
SYSTEM_TIME_REALTIME = 0, // system-wide realtime clock
SYSTEM_TIME_MONOTONIC = 1, // monotonic time since unspecified starting point
SYSTEM_TIME_PROCESS = 2, // high-resolution per-process clock
SYSTEM_TIME_THREAD = 3 // high-resolution per-thread clock
SYSTEM_TIME_THREAD = 3, // high-resolution per-thread clock
SYSTEM_TIME_BOOTTIME = 4 // same as SYSTEM_TIME_MONOTONIC, but including CPU suspend time
};
// return the system-time according to the specified clock
#ifdef __cplusplus
nsecs_t systemTime(int clock = SYSTEM_TIME_MONOTONIC);

View File

@ -105,8 +105,23 @@ int64_t uptimeMillis()
* native public static long elapsedRealtime();
*/
int64_t elapsedRealtime()
{
return nanoseconds_to_milliseconds(elapsedRealtimeNano());
}
/*
* native public static long elapsedRealtimeNano();
*/
int64_t elapsedRealtimeNano()
{
#ifdef HAVE_ANDROID_OS
struct timespec ts;
int result = clock_gettime(CLOCK_BOOTTIME, &ts);
if (result == 0) {
return seconds_to_nanoseconds(ts.tv_sec) + ts.tv_nsec;
}
// CLOCK_BOOTTIME doesn't exist, fallback to /dev/alarm
static int s_fd = -1;
if (s_fd == -1) {
@ -114,25 +129,20 @@ int64_t elapsedRealtime()
if (android_atomic_cmpxchg(-1, fd, &s_fd)) {
close(fd);
}
result = ioctl(s_fd,
ANDROID_ALARM_GET_TIME(ANDROID_ALARM_ELAPSED_REALTIME), &ts);
}
struct timespec ts;
int result = ioctl(s_fd,
ANDROID_ALARM_GET_TIME(ANDROID_ALARM_ELAPSED_REALTIME), &ts);
if (result == 0) {
int64_t when = seconds_to_nanoseconds(ts.tv_sec) + ts.tv_nsec;
return (int64_t) nanoseconds_to_milliseconds(when);
} else {
// XXX: there was an error, probably because the driver didn't
// exist ... this should return
// a real error, like an exception!
int64_t when = systemTime(SYSTEM_TIME_MONOTONIC);
return (int64_t) nanoseconds_to_milliseconds(when);
return seconds_to_nanoseconds(ts.tv_sec) + ts.tv_nsec;
}
// XXX: there was an error, probably because the driver didn't
// exist ... this should return
// a real error, like an exception!
return systemTime(SYSTEM_TIME_MONOTONIC);
#else
int64_t when = systemTime(SYSTEM_TIME_MONOTONIC);
return (int64_t) nanoseconds_to_milliseconds(when);
return systemTime(SYSTEM_TIME_MONOTONIC);
#endif
}

View File

@ -39,7 +39,8 @@ nsecs_t systemTime(int clock)
CLOCK_REALTIME,
CLOCK_MONOTONIC,
CLOCK_PROCESS_CPUTIME_ID,
CLOCK_THREAD_CPUTIME_ID
CLOCK_THREAD_CPUTIME_ID,
CLOCK_BOOTTIME
};
struct timespec t;
t.tv_sec = t.tv_nsec = 0;