Loading services/core/java/com/android/server/AlarmManagerService.java +15 −0 Original line number Diff line number Diff line Loading @@ -3518,9 +3518,13 @@ class AlarmManagerService extends SystemService { private class AlarmThread extends Thread { private int mFalseWakeups; private int mWtfThreshold; public AlarmThread() { super("AlarmManager"); mFalseWakeups = 0; mWtfThreshold = 10; } public void run() Loading Loading @@ -3633,6 +3637,17 @@ class AlarmManagerService extends SystemService { } mPendingNonWakeupAlarms.clear(); } if (mLastTimeChangeRealtime != nowELAPSED && triggerList.isEmpty()) { if (++mFalseWakeups >= mWtfThreshold) { Slog.wtf(TAG, "Too many (" + mFalseWakeups + ") false wakeups, nowElapsed=" + nowELAPSED); if (mWtfThreshold < 100_000) { mWtfThreshold *= 10; } else { mFalseWakeups = 0; } } } final ArraySet<Pair<String, Integer>> triggerPackages = new ArraySet<>(); for (int i = 0; i < triggerList.size(); i++) { Loading services/core/jni/com_android_server_AlarmManagerService.cpp +4 −2 Original line number Diff line number Diff line Loading @@ -194,7 +194,9 @@ int AlarmImpl::waitForAlarm() uint32_t alarm_idx = events[i].data.u32; uint64_t unused; ssize_t err = read(fds[alarm_idx], &unused, sizeof(unused)); if (err < 0) { // Worth evaluating even if read fails with EAGAIN, since epoll_wait // returned. (see b/78560047#comment34) if (err < 0 && errno != EAGAIN) { if (alarm_idx == ANDROID_ALARM_TYPE_COUNT && errno == ECANCELED) { result |= ANDROID_ALARM_TIME_CHANGE_MASK; } else { Loading Loading @@ -348,7 +350,7 @@ static jlong android_server_AlarmManagerService_init(JNIEnv*, jobject) } for (size_t i = 0; i < fds.size(); i++) { fds[i] = timerfd_create(android_alarm_to_clockid[i], 0); fds[i] = timerfd_create(android_alarm_to_clockid[i], TFD_NONBLOCK); if (fds[i] < 0) { log_timerfd_create_error(android_alarm_to_clockid[i]); close(epollfd); Loading Loading
services/core/java/com/android/server/AlarmManagerService.java +15 −0 Original line number Diff line number Diff line Loading @@ -3518,9 +3518,13 @@ class AlarmManagerService extends SystemService { private class AlarmThread extends Thread { private int mFalseWakeups; private int mWtfThreshold; public AlarmThread() { super("AlarmManager"); mFalseWakeups = 0; mWtfThreshold = 10; } public void run() Loading Loading @@ -3633,6 +3637,17 @@ class AlarmManagerService extends SystemService { } mPendingNonWakeupAlarms.clear(); } if (mLastTimeChangeRealtime != nowELAPSED && triggerList.isEmpty()) { if (++mFalseWakeups >= mWtfThreshold) { Slog.wtf(TAG, "Too many (" + mFalseWakeups + ") false wakeups, nowElapsed=" + nowELAPSED); if (mWtfThreshold < 100_000) { mWtfThreshold *= 10; } else { mFalseWakeups = 0; } } } final ArraySet<Pair<String, Integer>> triggerPackages = new ArraySet<>(); for (int i = 0; i < triggerList.size(); i++) { Loading
services/core/jni/com_android_server_AlarmManagerService.cpp +4 −2 Original line number Diff line number Diff line Loading @@ -194,7 +194,9 @@ int AlarmImpl::waitForAlarm() uint32_t alarm_idx = events[i].data.u32; uint64_t unused; ssize_t err = read(fds[alarm_idx], &unused, sizeof(unused)); if (err < 0) { // Worth evaluating even if read fails with EAGAIN, since epoll_wait // returned. (see b/78560047#comment34) if (err < 0 && errno != EAGAIN) { if (alarm_idx == ANDROID_ALARM_TYPE_COUNT && errno == ECANCELED) { result |= ANDROID_ALARM_TIME_CHANGE_MASK; } else { Loading Loading @@ -348,7 +350,7 @@ static jlong android_server_AlarmManagerService_init(JNIEnv*, jobject) } for (size_t i = 0; i < fds.size(); i++) { fds[i] = timerfd_create(android_alarm_to_clockid[i], 0); fds[i] = timerfd_create(android_alarm_to_clockid[i], TFD_NONBLOCK); if (fds[i] < 0) { log_timerfd_create_error(android_alarm_to_clockid[i]); close(epollfd); Loading