Loading services/java/com/android/server/AlarmManagerService.java +28 −1 Original line number Diff line number Diff line Loading @@ -162,6 +162,15 @@ class AlarmManagerService extends IAlarmManager.Stub { return alarms.get(index); } long getWhenByElapsedTime(long whenElapsed) { for(int i=0;i< alarms.size();i++) { if(alarms.get(i).whenElapsed == whenElapsed) return alarms.get(i).when; } return 0; } boolean canHold(long whenElapsed, long maxWhen) { return (end >= whenElapsed) && (start <= maxWhen); } Loading Loading @@ -700,7 +709,10 @@ class AlarmManagerService extends IAlarmManager.Stub { } if (firstRtcWakeup != null && mNextRtcWakeup != firstRtcWakeup.start) { mNextRtcWakeup = firstRtcWakeup.start; setLocked(RTC_POWEROFF_WAKEUP, firstRtcWakeup.start - SystemClock.elapsedRealtime()); long when = firstRtcWakeup.getWhenByElapsedTime(mNextRtcWakeup); if (when != 0) { setLocked(RTC_POWEROFF_WAKEUP, when); } } } Loading Loading @@ -813,6 +825,20 @@ class AlarmManagerService extends IAlarmManager.Stub { boolean didRemove = false; for (int i = mAlarmBatches.size() - 1; i >= 0; i--) { Batch b = mAlarmBatches.get(i); ArrayList<Alarm> alarmList = b.alarms; Alarm alarm = null; for (int j = alarmList.size() - 1; j >= 0; j--) { alarm = alarmList.get(j); if (alarm.type == RTC_POWEROFF_WAKEUP && alarm.operation.equals(operation)) { long alarmSeconds, alarmNanoseconds; alarmSeconds = alarm.when / 1000; alarmNanoseconds = (alarm.when % 1000) * 1000 * 1000; Slog.w(TAG,"Clear alarm type=" + alarm.type + ",alarmSeconds=" + alarmSeconds); clear(mDescriptor, alarm.type, alarmSeconds, alarmNanoseconds); mNextRtcWakeup = 0; } } didRemove |= b.remove(operation); if (b.size() == 0) { mAlarmBatches.remove(i); Loading Loading @@ -1100,6 +1126,7 @@ class AlarmManagerService extends IAlarmManager.Stub { private native int init(); private native void close(int fd); private native void set(int fd, int type, long seconds, long nanoseconds); private native void clear(int fd, int type, long seconds, long nanoseconds); private native int waitForAlarm(int fd); private native int setKernelTimezone(int fd, int minuteswest); Loading services/jni/com_android_server_AlarmManagerService.cpp +14 −0 Original line number Diff line number Diff line Loading @@ -78,6 +78,19 @@ static void android_server_AlarmManagerService_set(JNIEnv* env, jobject obj, jin } } static void android_server_AlarmManagerService_clear(JNIEnv* env, jobject obj, jint fd, jint type, jlong seconds, jlong nanoseconds) { struct timespec ts; ts.tv_sec = seconds; ts.tv_nsec = nanoseconds; int result = ioctl(fd, ANDROID_ALARM_CLEAR(type), &ts); if (result < 0) { ALOGE("Unable to clear alarm %lld.%09lld: %s\n", seconds, nanoseconds, strerror(errno)); } } static jint android_server_AlarmManagerService_waitForAlarm(JNIEnv* env, jobject obj, jint fd) { int result = 0; Loading @@ -101,6 +114,7 @@ static JNINativeMethod sMethods[] = { {"init", "()I", (void*)android_server_AlarmManagerService_init}, {"close", "(I)V", (void*)android_server_AlarmManagerService_close}, {"set", "(IIJJ)V", (void*)android_server_AlarmManagerService_set}, {"clear", "(IIJJ)V", (void*)android_server_AlarmManagerService_clear}, {"waitForAlarm", "(I)I", (void*)android_server_AlarmManagerService_waitForAlarm}, {"setKernelTimezone", "(II)I", (void*)android_server_AlarmManagerService_setKernelTimezone}, }; Loading Loading
services/java/com/android/server/AlarmManagerService.java +28 −1 Original line number Diff line number Diff line Loading @@ -162,6 +162,15 @@ class AlarmManagerService extends IAlarmManager.Stub { return alarms.get(index); } long getWhenByElapsedTime(long whenElapsed) { for(int i=0;i< alarms.size();i++) { if(alarms.get(i).whenElapsed == whenElapsed) return alarms.get(i).when; } return 0; } boolean canHold(long whenElapsed, long maxWhen) { return (end >= whenElapsed) && (start <= maxWhen); } Loading Loading @@ -700,7 +709,10 @@ class AlarmManagerService extends IAlarmManager.Stub { } if (firstRtcWakeup != null && mNextRtcWakeup != firstRtcWakeup.start) { mNextRtcWakeup = firstRtcWakeup.start; setLocked(RTC_POWEROFF_WAKEUP, firstRtcWakeup.start - SystemClock.elapsedRealtime()); long when = firstRtcWakeup.getWhenByElapsedTime(mNextRtcWakeup); if (when != 0) { setLocked(RTC_POWEROFF_WAKEUP, when); } } } Loading Loading @@ -813,6 +825,20 @@ class AlarmManagerService extends IAlarmManager.Stub { boolean didRemove = false; for (int i = mAlarmBatches.size() - 1; i >= 0; i--) { Batch b = mAlarmBatches.get(i); ArrayList<Alarm> alarmList = b.alarms; Alarm alarm = null; for (int j = alarmList.size() - 1; j >= 0; j--) { alarm = alarmList.get(j); if (alarm.type == RTC_POWEROFF_WAKEUP && alarm.operation.equals(operation)) { long alarmSeconds, alarmNanoseconds; alarmSeconds = alarm.when / 1000; alarmNanoseconds = (alarm.when % 1000) * 1000 * 1000; Slog.w(TAG,"Clear alarm type=" + alarm.type + ",alarmSeconds=" + alarmSeconds); clear(mDescriptor, alarm.type, alarmSeconds, alarmNanoseconds); mNextRtcWakeup = 0; } } didRemove |= b.remove(operation); if (b.size() == 0) { mAlarmBatches.remove(i); Loading Loading @@ -1100,6 +1126,7 @@ class AlarmManagerService extends IAlarmManager.Stub { private native int init(); private native void close(int fd); private native void set(int fd, int type, long seconds, long nanoseconds); private native void clear(int fd, int type, long seconds, long nanoseconds); private native int waitForAlarm(int fd); private native int setKernelTimezone(int fd, int minuteswest); Loading
services/jni/com_android_server_AlarmManagerService.cpp +14 −0 Original line number Diff line number Diff line Loading @@ -78,6 +78,19 @@ static void android_server_AlarmManagerService_set(JNIEnv* env, jobject obj, jin } } static void android_server_AlarmManagerService_clear(JNIEnv* env, jobject obj, jint fd, jint type, jlong seconds, jlong nanoseconds) { struct timespec ts; ts.tv_sec = seconds; ts.tv_nsec = nanoseconds; int result = ioctl(fd, ANDROID_ALARM_CLEAR(type), &ts); if (result < 0) { ALOGE("Unable to clear alarm %lld.%09lld: %s\n", seconds, nanoseconds, strerror(errno)); } } static jint android_server_AlarmManagerService_waitForAlarm(JNIEnv* env, jobject obj, jint fd) { int result = 0; Loading @@ -101,6 +114,7 @@ static JNINativeMethod sMethods[] = { {"init", "()I", (void*)android_server_AlarmManagerService_init}, {"close", "(I)V", (void*)android_server_AlarmManagerService_close}, {"set", "(IIJJ)V", (void*)android_server_AlarmManagerService_set}, {"clear", "(IIJJ)V", (void*)android_server_AlarmManagerService_clear}, {"waitForAlarm", "(I)I", (void*)android_server_AlarmManagerService_waitForAlarm}, {"setKernelTimezone", "(II)I", (void*)android_server_AlarmManagerService_setKernelTimezone}, }; Loading