summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNanang Izzuddin <nanang@teluu.com>2016-10-06 04:05:02 +0000
committerNanang Izzuddin <nanang@teluu.com>2016-10-06 04:05:02 +0000
commit7926ed468298e5340ed20a85c9bea6a6957a0b79 (patch)
tree1134763d28e91fbbc03db882a7b78c60e037d1aa
parent4ba1d660f11ec919235c7250233118e3fd53e2f9 (diff)
Fix #1961: Updated Android timestamp to use CLOCK_BOOTTIME (or ANDROID_ALARM_ELAPSED_REALTIME for older NDK version), to avoid suspended clock when CPU is in deep sleep.
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@5447 74dad513-b988-da41-8d7b-12977e46ad98
-rw-r--r--pjlib/src/pj/os_timestamp_posix.c56
1 files changed, 56 insertions, 0 deletions
diff --git a/pjlib/src/pj/os_timestamp_posix.c b/pjlib/src/pj/os_timestamp_posix.c
index 28805150..d0b08089 100644
--- a/pjlib/src/pj/os_timestamp_posix.c
+++ b/pjlib/src/pj/os_timestamp_posix.c
@@ -160,6 +160,62 @@ PJ_DEF(pj_status_t) pj_get_timestamp_freq(pj_timestamp *freq)
return PJ_SUCCESS;
}
+#elif defined(__ANDROID__)
+#include <errno.h>
+#include <time.h>
+
+#if !defined(CLOCK_BOOTTIME)
+# include <linux/android_alarm.h>
+# include <fcntl.h>
+#endif
+
+#define NSEC_PER_SEC 1000000000
+
+PJ_DEF(pj_status_t) pj_get_timestamp(pj_timestamp *ts)
+{
+ struct timespec tp;
+
+#if defined(CLOCK_BOOTTIME)
+ /* Use CLOCK_BOOTTIME if supported */
+ if (clock_gettime(CLOCK_BOOTTIME, &tp) != 0) {
+ return PJ_RETURN_OS_ERROR(pj_get_native_os_error());
+ }
+#else
+ /* For older NDK version, use ANDROID_ALARM_ELAPSED_REALTIME */
+ static int s_fd = -1;
+
+ if (s_fd == -1) {
+ int fd = open("/dev/alarm", O_RDONLY);
+ if (fd >= 0) {
+ s_fd = fd;
+ //close(fd);
+ } else {
+ return PJ_RETURN_OS_ERROR(pj_get_native_os_error());
+ }
+ }
+ int err = ioctl(s_fd,
+ ANDROID_ALARM_GET_TIME(ANDROID_ALARM_ELAPSED_REALTIME), &tp);
+
+ if (err != 0) {
+ return PJ_RETURN_OS_ERROR(pj_get_native_os_error());
+ }
+#endif
+
+ ts->u64 = tp.tv_sec;
+ ts->u64 *= NSEC_PER_SEC;
+ ts->u64 += tp.tv_nsec;
+
+ return PJ_SUCCESS;
+}
+
+PJ_DEF(pj_status_t) pj_get_timestamp_freq(pj_timestamp *freq)
+{
+ freq->u32.hi = 0;
+ freq->u32.lo = NSEC_PER_SEC;
+
+ return PJ_SUCCESS;
+}
+
#elif defined(USE_POSIX_TIMERS) && USE_POSIX_TIMERS != 0
#include <sys/time.h>
#include <time.h>