diff options
Diffstat (limited to 'services')
| -rw-r--r-- | services/core/java/com/android/server/AlarmManagerService.java | 9 | ||||
| -rw-r--r-- | services/core/jni/com_android_server_AlarmManagerService.cpp | 29 |
2 files changed, 38 insertions, 0 deletions
diff --git a/services/core/java/com/android/server/AlarmManagerService.java b/services/core/java/com/android/server/AlarmManagerService.java index 99912d9c490c..6ca81c2889ab 100644 --- a/services/core/java/com/android/server/AlarmManagerService.java +++ b/services/core/java/com/android/server/AlarmManagerService.java @@ -1953,6 +1953,14 @@ class AlarmManagerService extends SystemService { pw.print(" = "); pw.println(sdf.format(new Date(nextWakeupRTC))); pw.print(" set at "); TimeUtils.formatDuration(mLastWakeupSet, nowELAPSED, pw); pw.println(); + + pw.print(" Next kernel non-wakeup alarm: "); + TimeUtils.formatDuration(getNextAlarm(mNativeData, ELAPSED_REALTIME), pw); + pw.println(); + pw.print(" Next kernel wakeup alarm: "); + TimeUtils.formatDuration(getNextAlarm(mNativeData, ELAPSED_REALTIME_WAKEUP), pw); + pw.println(); + pw.print(" Last wakeup: "); TimeUtils.formatDuration(mLastWakeup, nowELAPSED, pw); pw.print(" = "); pw.println(mLastWakeup); pw.print(" Last trigger: "); TimeUtils.formatDuration(mLastTrigger, nowELAPSED, pw); @@ -3063,6 +3071,7 @@ class AlarmManagerService extends SystemService { private native int waitForAlarm(long nativeData); private native int setKernelTime(long nativeData, long millis); private native int setKernelTimezone(long nativeData, int minuteswest); + private native long getNextAlarm(long nativeData, int type); private long getWhileIdleMinIntervalLocked(int uid) { final boolean dozing = mPendingIdleUntil != null; diff --git a/services/core/jni/com_android_server_AlarmManagerService.cpp b/services/core/jni/com_android_server_AlarmManagerService.cpp index 47350c11f958..921eed98d0a8 100644 --- a/services/core/jni/com_android_server_AlarmManagerService.cpp +++ b/services/core/jni/com_android_server_AlarmManagerService.cpp @@ -81,6 +81,7 @@ public: int set(int type, struct timespec *ts); int setTime(struct timeval *tv); int waitForAlarm(); + int getTime(int type, struct itimerspec *spec); private: const TimerFds fds; @@ -118,6 +119,16 @@ int AlarmImpl::set(int type, struct timespec *ts) return timerfd_settime(fds[type], TFD_TIMER_ABSTIME, &spec, NULL); } +int AlarmImpl::getTime(int type, struct itimerspec *spec) +{ + if (static_cast<size_t>(type) > ANDROID_ALARM_TYPE_COUNT) { + errno = EINVAL; + return -1; + } + + return timerfd_gettime(fds[type], spec); +} + int AlarmImpl::setTime(struct timeval *tv) { struct rtc_time rtc; @@ -379,6 +390,23 @@ static jlong android_server_AlarmManagerService_init(JNIEnv*, jobject) return reinterpret_cast<jlong>(ret); } +static jlong android_server_AlarmManagerService_getNextAlarm(JNIEnv*, jobject, jlong nativeData, jint type) +{ + AlarmImpl *impl = reinterpret_cast<AlarmImpl *>(nativeData); + struct itimerspec spec; + memset(&spec, 0, sizeof(spec)); + const int result = impl->getTime(type, &spec); + if (result < 0) + { + ALOGE("timerfd_gettime() failed for fd %d: %s\n", static_cast<int>(type), strerror(errno)); + return result; + } + struct timespec nextTimespec = spec.it_value; + long long millis = nextTimespec.tv_sec * 1000LL; + millis += (nextTimespec.tv_nsec / 1000000LL); + return static_cast<jlong>(millis); +} + static void android_server_AlarmManagerService_close(JNIEnv*, jobject, jlong nativeData) { AlarmImpl *impl = reinterpret_cast<AlarmImpl *>(nativeData); @@ -429,6 +457,7 @@ static const JNINativeMethod sMethods[] = { {"waitForAlarm", "(J)I", (void*)android_server_AlarmManagerService_waitForAlarm}, {"setKernelTime", "(JJ)I", (void*)android_server_AlarmManagerService_setKernelTime}, {"setKernelTimezone", "(JI)I", (void*)android_server_AlarmManagerService_setKernelTimezone}, + {"getNextAlarm", "(JI)J", (void*)android_server_AlarmManagerService_getNextAlarm}, }; int register_android_server_AlarmManagerService(JNIEnv* env) |