SystemClock: use clock_gettime() on devices without /dev/alarm

On devices with an up-to-date kernel, the back-in-time bug affecting
clock_gettime() has been fixed and it can safely be used as an
alternative to the ANDROID_ALARM_GET_TIME ioctl.  To ensure consistent
behavior on existing devices, make clock_gettime() a fallback for when
the alarm driver isn't available.

Change-Id: I384af5e7ec9e73e0bad4b6b0f987a8ea4583cba6
Signed-off-by: Greg Hackmann <ghackmann@google.com>
This commit is contained in:
Greg Hackmann 2013-12-16 17:04:32 -08:00
parent a585e662e0
commit 64289760a2
1 changed files with 9 additions and 16 deletions

View File

@ -119,22 +119,6 @@ int64_t elapsedRealtimeNano()
static volatile int prevMethod;
#endif
#if 0
/*
* b/7100774
* clock_gettime appears to have clock skews and can sometimes return
* backwards values. Disable its use until we find out what's wrong.
*/
result = clock_gettime(CLOCK_BOOTTIME, &ts);
if (result == 0) {
timestamp = seconds_to_nanoseconds(ts.tv_sec) + ts.tv_nsec;
checkTimeStamps(timestamp, &prevTimestamp, &prevMethod,
METHOD_CLOCK_GETTIME);
return timestamp;
}
#endif
// CLOCK_BOOTTIME doesn't exist, fallback to /dev/alarm
static int s_fd = -1;
if (s_fd == -1) {
@ -153,6 +137,15 @@ int64_t elapsedRealtimeNano()
return timestamp;
}
// /dev/alarm doesn't exist, fallback to CLOCK_BOOTTIME
result = clock_gettime(CLOCK_BOOTTIME, &ts);
if (result == 0) {
timestamp = seconds_to_nanoseconds(ts.tv_sec) + ts.tv_nsec;
checkTimeStamps(timestamp, &prevTimestamp, &prevMethod,
METHOD_CLOCK_GETTIME);
return timestamp;
}
// XXX: there was an error, probably because the driver didn't
// exist ... this should return
// a real error, like an exception!