Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d9545a91 authored by Dianne Hackborn's avatar Dianne Hackborn
Browse files

Allow bound processes to go PROCESS_STATE_TOP.

For process state, if a top process is making use of another
process, we should probably count the second process as top
as well (instead of IMPORTANT_FOREGROUND).  Specially, when
chrome binds to render processes we want those render
processes to be TOP.  Otherwise, they end up in the
important foreground state and it looks like they are running
for some other reason in the background.

Change-Id: Id115dbb65dc2b403ffa4bbe4e7837564eb3b9cb5
parent b0037316
Loading
Loading
Loading
Loading
+29 −9
Original line number Original line Diff line number Diff line
@@ -13830,7 +13830,7 @@ public final class ActivityManagerService extends ActivityManagerNative
        for (int is = app.services.size()-1;
        for (int is = app.services.size()-1;
                is >= 0 && (adj > ProcessList.FOREGROUND_APP_ADJ
                is >= 0 && (adj > ProcessList.FOREGROUND_APP_ADJ
                        || schedGroup == Process.THREAD_GROUP_BG_NONINTERACTIVE
                        || schedGroup == Process.THREAD_GROUP_BG_NONINTERACTIVE
                        || procState > ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND);
                        || procState > ActivityManager.PROCESS_STATE_TOP);
                is--) {
                is--) {
            ServiceRecord s = app.services.valueAt(is);
            ServiceRecord s = app.services.valueAt(is);
            if (s.startRequested) {
            if (s.startRequested) {
@@ -13871,13 +13871,13 @@ public final class ActivityManagerService extends ActivityManagerNative
            for (int conni = s.connections.size()-1;
            for (int conni = s.connections.size()-1;
                    conni >= 0 && (adj > ProcessList.FOREGROUND_APP_ADJ
                    conni >= 0 && (adj > ProcessList.FOREGROUND_APP_ADJ
                            || schedGroup == Process.THREAD_GROUP_BG_NONINTERACTIVE
                            || schedGroup == Process.THREAD_GROUP_BG_NONINTERACTIVE
                            || procState > ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND);
                            || procState > ActivityManager.PROCESS_STATE_TOP);
                    conni--) {
                    conni--) {
                ArrayList<ConnectionRecord> clist = s.connections.valueAt(conni);
                ArrayList<ConnectionRecord> clist = s.connections.valueAt(conni);
                for (int i = 0;
                for (int i = 0;
                        i < clist.size() && (adj > ProcessList.FOREGROUND_APP_ADJ
                        i < clist.size() && (adj > ProcessList.FOREGROUND_APP_ADJ
                                || schedGroup == Process.THREAD_GROUP_BG_NONINTERACTIVE
                                || schedGroup == Process.THREAD_GROUP_BG_NONINTERACTIVE
                                || procState > ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND);
                                || procState > ActivityManager.PROCESS_STATE_TOP);
                        i++) {
                        i++) {
                    // XXX should compute this based on the max of
                    // XXX should compute this based on the max of
                    // all connected clients.
                    // all connected clients.
@@ -13987,8 +13987,16 @@ public final class ActivityManagerService extends ActivityManagerNative
                            if (client.curSchedGroup == Process.THREAD_GROUP_DEFAULT) {
                            if (client.curSchedGroup == Process.THREAD_GROUP_DEFAULT) {
                                schedGroup = Process.THREAD_GROUP_DEFAULT;
                                schedGroup = Process.THREAD_GROUP_DEFAULT;
                            }
                            }
                            if (clientProcState <
                            if (clientProcState <=
                                    ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND) {
                                    ActivityManager.PROCESS_STATE_PERSISTENT_UI &&
                                    clientProcState >=
                                            ActivityManager.PROCESS_STATE_PERSISTENT) {
                                // Persistent processes don't allow us to become top.
                                // However the top process DOES allow us to become top,
                                // because in that case we are running because the current
                                // top process wants us, so we should be counted as part
                                // of the top set and not just running for some random
                                // unknown reason in the background.
                                clientProcState =
                                clientProcState =
                                        ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND;
                                        ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND;
                            }
                            }
@@ -14040,13 +14048,13 @@ public final class ActivityManagerService extends ActivityManagerNative
        for (int provi = app.pubProviders.size()-1;
        for (int provi = app.pubProviders.size()-1;
                provi >= 0 && (adj > ProcessList.FOREGROUND_APP_ADJ
                provi >= 0 && (adj > ProcessList.FOREGROUND_APP_ADJ
                        || schedGroup == Process.THREAD_GROUP_BG_NONINTERACTIVE
                        || schedGroup == Process.THREAD_GROUP_BG_NONINTERACTIVE
                        || procState > ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND);
                        || procState > ActivityManager.PROCESS_STATE_TOP);
                provi--) {
                provi--) {
            ContentProviderRecord cpr = app.pubProviders.valueAt(provi);
            ContentProviderRecord cpr = app.pubProviders.valueAt(provi);
            for (int i = cpr.connections.size()-1;
            for (int i = cpr.connections.size()-1;
                    i >= 0 && (adj > ProcessList.FOREGROUND_APP_ADJ
                    i >= 0 && (adj > ProcessList.FOREGROUND_APP_ADJ
                            || schedGroup == Process.THREAD_GROUP_BG_NONINTERACTIVE
                            || schedGroup == Process.THREAD_GROUP_BG_NONINTERACTIVE
                            || procState > ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND);
                            || procState > ActivityManager.PROCESS_STATE_TOP);
                    i--) {
                    i--) {
                ContentProviderConnection conn = cpr.connections.get(i);
                ContentProviderConnection conn = cpr.connections.get(i);
                ProcessRecord client = conn.client;
                ProcessRecord client = conn.client;
@@ -14078,9 +14086,21 @@ public final class ActivityManagerService extends ActivityManagerNative
                    app.adjSourceOom = clientAdj;
                    app.adjSourceOom = clientAdj;
                    app.adjTarget = cpr.name;
                    app.adjTarget = cpr.name;
                }
                }
                if (clientProcState <=
                        ActivityManager.PROCESS_STATE_PERSISTENT_UI &&
                        clientProcState >=
                                ActivityManager.PROCESS_STATE_PERSISTENT) {
                    // Persistent processes don't allow us to become top.
                    // However the top process DOES allow us to become top,
                    // because in that case we are running because the current
                    // top process wants us, so we should be counted as part
                    // of the top set and not just running for some random
                    // unknown reason in the background.
                    clientProcState =
                            ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND;
                }
                if (procState > clientProcState) {
                if (procState > clientProcState) {
                    procState = clientProcState > ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND
                    procState = clientProcState;
                            ? clientProcState : ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND;
                }
                }
                if (client.curSchedGroup == Process.THREAD_GROUP_DEFAULT) {
                if (client.curSchedGroup == Process.THREAD_GROUP_DEFAULT) {
                    schedGroup = Process.THREAD_GROUP_DEFAULT;
                    schedGroup = Process.THREAD_GROUP_DEFAULT;