Prevent recursion in resumeTopActivityLocked
The existing recursion in resumeTopActivityLocked() finally caused
a problem by attempting to pause the same activity twice. By
preventing the recursion with this change we no longer face that
problem.
Fixes bug 17260463.
Change-Id: I0954614fc1a7dc0eeeef9335c1b973a42a7fc345
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java
index 3efd049..43fc88d 100755
--- a/services/core/java/com/android/server/am/ActivityStack.java
+++ b/services/core/java/com/android/server/am/ActivityStack.java
@@ -241,6 +241,9 @@
/** Run all ActivityStacks through this */
final ActivityStackSupervisor mStackSupervisor;
+ /** Used to keep resumeTopActivityLocked() from being entered recursively */
+ private boolean inResumeTopActivity;
+
static final int PAUSE_TIMEOUT_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 1;
static final int DESTROY_TIMEOUT_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 2;
static final int LAUNCH_TICK_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 3;
@@ -1439,6 +1442,23 @@
}
final boolean resumeTopActivityLocked(ActivityRecord prev, Bundle options) {
+ if (inResumeTopActivity) {
+ // Don't even start recursing.
+ return false;
+ }
+
+ boolean result = false;
+ try {
+ // Protect against recursion.
+ inResumeTopActivity = true;
+ result = resumeTopActivityInnerLocked(prev, options);
+ } finally {
+ inResumeTopActivity = false;
+ }
+ return result;
+ }
+
+ final boolean resumeTopActivityInnerLocked(ActivityRecord prev, Bundle options) {
if (ActivityManagerService.DEBUG_LOCKSCREEN) mService.logLockScreen("");
ActivityRecord parent = mActivityContainer.mParentActivity;