diff options
| author | 2017-09-29 18:05:18 +0000 | |
|---|---|---|
| committer | 2017-09-29 18:05:18 +0000 | |
| commit | cff3d13a5cc359f0873cfc05a9c8fa2a42f67db6 (patch) | |
| tree | f7b81f29c960af2f1f9ab78e031b8fe6e437718d | |
| parent | 9c99f3257c51c6d02aab9e9f1c18030ee6b15146 (diff) | |
| parent | 0ab501b9821be7c82fb0c2b28695c9ef7cb76c7f (diff) | |
Merge "Reduce synchronized lock scope." into oc-mr1-dev am: 9b6ef6a8f6
am: 0ab501b982
Change-Id: I4cfd66ba2f1748751c5355466bedb36d5d369bba
| -rw-r--r-- | services/core/java/com/android/server/am/ActivityStack.java | 232 | 
1 files changed, 118 insertions, 114 deletions
| diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index 885f6d9e1532..7eb6edaa0bd1 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -2138,14 +2138,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai          try {              // Protect against recursion.              mStackSupervisor.inResumeTopActivity = true; -            // The contained logic must be synchronized, since we are both changing the visibility -            // and updating the {@link Configuration}. {@link ActivityRecord#setVisibility} will -            // ultimately cause the client code to schedule a layout. Since layouts retrieve the -            // current {@link Configuration}, we must ensure that the below code updates it before -            // the layout can occur. -            synchronized (mWindowManager.getWindowManagerLock()) { -                result = resumeTopActivityInnerLocked(prev, options); -            } +            result = resumeTopActivityInnerLocked(prev, options);          } finally {              mStackSupervisor.inResumeTopActivity = false;          } @@ -2454,128 +2447,139 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai                      || (lastStack.mLastPausedActivity != null                      && !lastStack.mLastPausedActivity.fullscreen)); -            // This activity is now becoming visible. -            if (!next.visible || next.stopped || lastActivityTranslucent) { -                next.setVisibility(true); -            } +            // The contained logic must be synchronized, since we are both changing the visibility +            // and updating the {@link Configuration}. {@link ActivityRecord#setVisibility} will +            // ultimately cause the client code to schedule a layout. Since layouts retrieve the +            // current {@link Configuration}, we must ensure that the below code updates it before +            // the layout can occur. +            synchronized(mWindowManager.getWindowManagerLock()) { +                // This activity is now becoming visible. +                if (!next.visible || next.stopped || lastActivityTranslucent) { +                    next.setVisibility(true); +                } -            // schedule launch ticks to collect information about slow apps. -            next.startLaunchTickingLocked(); +                // schedule launch ticks to collect information about slow apps. +                next.startLaunchTickingLocked(); -            ActivityRecord lastResumedActivity = -                    lastStack == null ? null :lastStack.mResumedActivity; -            ActivityState lastState = next.state; +                ActivityRecord lastResumedActivity = +                        lastStack == null ? null :lastStack.mResumedActivity; +                ActivityState lastState = next.state; -            mService.updateCpuStats(); +                mService.updateCpuStats(); -            if (DEBUG_STATES) Slog.v(TAG_STATES, "Moving to RESUMED: " + next + " (in existing)"); +                if (DEBUG_STATES) Slog.v(TAG_STATES, "Moving to RESUMED: " + next +                        + " (in existing)"); -            setResumedActivityLocked(next, "resumeTopActivityInnerLocked"); +                setResumedActivityLocked(next, "resumeTopActivityInnerLocked"); -            mService.updateLruProcessLocked(next.app, true, null); -            updateLRUListLocked(next); -            mService.updateOomAdjLocked(); +                mService.updateLruProcessLocked(next.app, true, null); +                updateLRUListLocked(next); +                mService.updateOomAdjLocked(); -            // Have the window manager re-evaluate the orientation of -            // the screen based on the new activity order. -            boolean notUpdated = true; -            if (mStackSupervisor.isFocusedStack(this)) { - -                // We have special rotation behavior when Keyguard is locked. Make sure all activity -                // visibilities are set correctly as well as the transition is updated if needed to -                // get the correct rotation behavior. -                // TODO: Remove this once visibilities are set correctly immediately when starting -                // an activity. -                if (mStackSupervisor.mKeyguardController.isKeyguardLocked()) { -                    mStackSupervisor.ensureActivitiesVisibleLocked(null /* starting */, -                            0 /* configChanges */, false /* preserveWindows */); -                } -                final Configuration config = mWindowManager.updateOrientationFromAppTokens( -                        mStackSupervisor.getDisplayOverrideConfiguration(mDisplayId), -                        next.mayFreezeScreenLocked(next.app) ? next.appToken : null, mDisplayId); -                if (config != null) { -                    next.frozenBeforeDestroy = true; -                } -                notUpdated = !mService.updateDisplayOverrideConfigurationLocked(config, next, -                        false /* deferResume */, mDisplayId); -            } - -            if (notUpdated) { -                // The configuration update wasn't able to keep the existing -                // instance of the activity, and instead started a new one. -                // We should be all done, but let's just make sure our activity -                // is still at the top and schedule another run if something -                // weird happened. -                ActivityRecord nextNext = topRunningActivityLocked(); -                if (DEBUG_SWITCH || DEBUG_STATES) Slog.i(TAG_STATES, -                        "Activity config changed during resume: " + next -                        + ", new next: " + nextNext); -                if (nextNext != next) { -                    // Do over! -                    mStackSupervisor.scheduleResumeTopActivities(); -                } -                if (!next.visible || next.stopped) { -                    next.setVisibility(true); -                } -                next.completeResumeLocked(); -                if (DEBUG_STACK) mStackSupervisor.validateTopActivitiesLocked(); -                return true; -            } +                // Have the window manager re-evaluate the orientation of +                // the screen based on the new activity order. +                boolean notUpdated = true; -            try { -                // Deliver all pending results. -                ArrayList<ResultInfo> a = next.results; -                if (a != null) { -                    final int N = a.size(); -                    if (!next.finishing && N > 0) { -                        if (DEBUG_RESULTS) Slog.v(TAG_RESULTS, -                                "Delivering results to " + next + ": " + a); -                        next.app.thread.scheduleSendResult(next.appToken, a); +                if (mStackSupervisor.isFocusedStack(this)) { + +                    // We have special rotation behavior when Keyguard is locked. Make sure all +                    // activity visibilities are set correctly as well as the transition is updated +                    // if needed to get the correct rotation behavior. +                    // TODO: Remove this once visibilities are set correctly immediately when +                    // starting an activity. +                    if (mStackSupervisor.mKeyguardController.isKeyguardLocked()) { +                        mStackSupervisor.ensureActivitiesVisibleLocked(null /* starting */, +                                0 /* configChanges */, false /* preserveWindows */); +                    } +                    final Configuration config = mWindowManager.updateOrientationFromAppTokens( +                            mStackSupervisor.getDisplayOverrideConfiguration(mDisplayId), +                            next.mayFreezeScreenLocked(next.app) ? next.appToken : null, +                                    mDisplayId); +                    if (config != null) { +                        next.frozenBeforeDestroy = true;                      } +                    notUpdated = !mService.updateDisplayOverrideConfigurationLocked(config, next, +                            false /* deferResume */, mDisplayId);                  } -                if (next.newIntents != null) { -                    next.app.thread.scheduleNewIntent( -                            next.newIntents, next.appToken, false /* andPause */); +                if (notUpdated) { +                    // The configuration update wasn't able to keep the existing +                    // instance of the activity, and instead started a new one. +                    // We should be all done, but let's just make sure our activity +                    // is still at the top and schedule another run if something +                    // weird happened. +                    ActivityRecord nextNext = topRunningActivityLocked(); +                    if (DEBUG_SWITCH || DEBUG_STATES) Slog.i(TAG_STATES, +                            "Activity config changed during resume: " + next +                                    + ", new next: " + nextNext); +                    if (nextNext != next) { +                        // Do over! +                        mStackSupervisor.scheduleResumeTopActivities(); +                    } +                    if (!next.visible || next.stopped) { +                        next.setVisibility(true); +                    } +                    next.completeResumeLocked(); +                    if (DEBUG_STACK) mStackSupervisor.validateTopActivitiesLocked(); +                    return true;                  } -                // Well the app will no longer be stopped. -                // Clear app token stopped state in window manager if needed. -                next.notifyAppResumed(next.stopped); - -                EventLog.writeEvent(EventLogTags.AM_RESUME_ACTIVITY, next.userId, -                        System.identityHashCode(next), next.getTask().taskId, -                        next.shortComponentName); +                try { +                    // Deliver all pending results. +                    ArrayList<ResultInfo> a = next.results; +                    if (a != null) { +                        final int N = a.size(); +                        if (!next.finishing && N > 0) { +                            if (DEBUG_RESULTS) Slog.v(TAG_RESULTS, +                                    "Delivering results to " + next + ": " + a); +                            next.app.thread.scheduleSendResult(next.appToken, a); +                        } +                    } -                next.sleeping = false; -                mService.showUnsupportedZoomDialogIfNeededLocked(next); -                mService.showAskCompatModeDialogLocked(next); -                next.app.pendingUiClean = true; -                next.app.forceProcessStateUpTo(mService.mTopProcessState); -                next.clearOptionsLocked(); -                next.app.thread.scheduleResumeActivity(next.appToken, next.app.repProcState, -                        mService.isNextTransitionForward(), resumeAnimOptions); +                    if (next.newIntents != null) { +                        next.app.thread.scheduleNewIntent( +                                next.newIntents, next.appToken, false /* andPause */); +                    } -                if (DEBUG_STATES) Slog.d(TAG_STATES, "resumeTopActivityLocked: Resumed " + next); -            } catch (Exception e) { -                // Whoops, need to restart this activity! -                if (DEBUG_STATES) Slog.v(TAG_STATES, "Resume failed; resetting state to " -                        + lastState + ": " + next); -                next.state = lastState; -                if (lastStack != null) { -                    lastStack.mResumedActivity = lastResumedActivity; -                } -                Slog.i(TAG, "Restarting because process died: " + next); -                if (!next.hasBeenLaunched) { -                    next.hasBeenLaunched = true; -                } else  if (SHOW_APP_STARTING_PREVIEW && lastStack != null && -                        mStackSupervisor.isFrontStackOnDisplay(lastStack)) { -                    next.showStartingWindow(null /* prev */, false /* newTask */, -                            false /* taskSwitch */); +                    // Well the app will no longer be stopped. +                    // Clear app token stopped state in window manager if needed. +                    next.notifyAppResumed(next.stopped); + +                    EventLog.writeEvent(EventLogTags.AM_RESUME_ACTIVITY, next.userId, +                            System.identityHashCode(next), next.getTask().taskId, +                            next.shortComponentName); + +                    next.sleeping = false; +                    mService.showUnsupportedZoomDialogIfNeededLocked(next); +                    mService.showAskCompatModeDialogLocked(next); +                    next.app.pendingUiClean = true; +                    next.app.forceProcessStateUpTo(mService.mTopProcessState); +                    next.clearOptionsLocked(); +                    next.app.thread.scheduleResumeActivity(next.appToken, next.app.repProcState, +                            mService.isNextTransitionForward(), resumeAnimOptions); + +                    if (DEBUG_STATES) Slog.d(TAG_STATES, "resumeTopActivityLocked: Resumed " +                            + next); +                } catch (Exception e) { +                    // Whoops, need to restart this activity! +                    if (DEBUG_STATES) Slog.v(TAG_STATES, "Resume failed; resetting state to " +                            + lastState + ": " + next); +                    next.state = lastState; +                    if (lastStack != null) { +                        lastStack.mResumedActivity = lastResumedActivity; +                    } +                    Slog.i(TAG, "Restarting because process died: " + next); +                    if (!next.hasBeenLaunched) { +                        next.hasBeenLaunched = true; +                    } else  if (SHOW_APP_STARTING_PREVIEW && lastStack != null && +                            mStackSupervisor.isFrontStackOnDisplay(lastStack)) { +                        next.showStartingWindow(null /* prev */, false /* newTask */, +                                false /* taskSwitch */); +                    } +                    mStackSupervisor.startSpecificActivityLocked(next, true, false); +                    if (DEBUG_STACK) mStackSupervisor.validateTopActivitiesLocked(); +                    return true;                  } -                mStackSupervisor.startSpecificActivityLocked(next, true, false); -                if (DEBUG_STACK) mStackSupervisor.validateTopActivitiesLocked(); -                return true;              }              // From this point on, if something goes wrong there is no way |