• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2020 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.server.am;
18 
19 import com.android.internal.annotations.GuardedBy;
20 import com.android.internal.annotations.VisibleForTesting;
21 
22 import java.io.PrintWriter;
23 
24 /**
25  * The state info of app when it's cached, used by the optimizer.
26  */
27 final class ProcessCachedOptimizerRecord {
28     private final ProcessRecord mApp;
29 
30     private final ActivityManagerGlobalLock mProcLock;
31 
32     @VisibleForTesting
33     static final String IS_FROZEN = "isFrozen";
34 
35     /**
36      * The last time that this process was compacted.
37      */
38     @GuardedBy("mProcLock")
39     private long mLastCompactTime;
40 
41     /**
42      * The most recent compaction action requested for this app.
43      */
44     @GuardedBy("mProcLock")
45     private int mReqCompactAction;
46 
47     /**
48      * The most recent compaction action performed for this app.
49      */
50     @GuardedBy("mProcLock")
51     private int mLastCompactAction;
52 
53     /**
54      * This process has been scheduled for a memory compaction.
55      */
56     @GuardedBy("mProcLock")
57     private boolean mPendingCompact;
58 
59     @GuardedBy("mProcLock") private boolean mForceCompact;
60 
61     /**
62      * True when the process is frozen.
63      */
64     @GuardedBy("mProcLock")
65     private boolean mFrozen;
66 
67     /**
68      * An override on the freeze state is in progress.
69      */
70     @GuardedBy("mProcLock")
71     boolean mFreezerOverride;
72 
73     /**
74      * Last time the app was (un)frozen, 0 for never.
75      */
76     @GuardedBy("mProcLock")
77     private long mFreezeUnfreezeTime;
78 
79     /**
80      * True if a process has a WPRI binding from an unfrozen process.
81      */
82     @GuardedBy("mProcLock")
83     private boolean mShouldNotFreeze;
84 
85     /**
86      * Exempt from freezer (now for system apps with INSTALL_PACKAGES permission)
87      */
88     @GuardedBy("mProcLock")
89     private boolean mFreezeExempt;
90 
91     /**
92      * This process has been scheduled for freezing
93      */
94     @GuardedBy("mProcLock")
95     private boolean mPendingFreeze;
96 
97     @GuardedBy("mProcLock")
getLastCompactTime()98     long getLastCompactTime() {
99         return mLastCompactTime;
100     }
101 
102     @GuardedBy("mProcLock")
setLastCompactTime(long lastCompactTime)103     void setLastCompactTime(long lastCompactTime) {
104         mLastCompactTime = lastCompactTime;
105     }
106 
107     @GuardedBy("mProcLock")
getReqCompactAction()108     int getReqCompactAction() {
109         return mReqCompactAction;
110     }
111 
112     @GuardedBy("mProcLock")
setReqCompactAction(int reqCompactAction)113     void setReqCompactAction(int reqCompactAction) {
114         mReqCompactAction = reqCompactAction;
115     }
116 
117     @GuardedBy("mProcLock")
getLastCompactAction()118     int getLastCompactAction() {
119         return mLastCompactAction;
120     }
121 
122     @GuardedBy("mProcLock")
setLastCompactAction(int lastCompactAction)123     void setLastCompactAction(int lastCompactAction) {
124         mLastCompactAction = lastCompactAction;
125     }
126 
127     @GuardedBy("mProcLock")
hasPendingCompact()128     boolean hasPendingCompact() {
129         return mPendingCompact;
130     }
131 
132     @GuardedBy("mProcLock")
setHasPendingCompact(boolean pendingCompact)133     void setHasPendingCompact(boolean pendingCompact) {
134         mPendingCompact = pendingCompact;
135     }
136 
137     @GuardedBy("mProcLock")
isForceCompact()138     boolean isForceCompact() {
139         return mForceCompact;
140     }
141 
142     @GuardedBy("mProcLock")
setForceCompact(boolean forceCompact)143     void setForceCompact(boolean forceCompact) {
144         mForceCompact = forceCompact;
145     }
146 
147     @GuardedBy("mProcLock")
isFrozen()148     boolean isFrozen() {
149         return mFrozen;
150     }
151 
152     @GuardedBy("mProcLock")
setFrozen(boolean frozen)153     void setFrozen(boolean frozen) {
154         mFrozen = frozen;
155     }
156 
157     @GuardedBy("mProcLock")
hasFreezerOverride()158     boolean hasFreezerOverride() {
159         return mFreezerOverride;
160     }
161 
162     @GuardedBy("mProcLock")
setFreezerOverride(boolean freezerOverride)163     void setFreezerOverride(boolean freezerOverride) {
164         mFreezerOverride = freezerOverride;
165     }
166 
167     @GuardedBy("mProcLock")
getFreezeUnfreezeTime()168     long getFreezeUnfreezeTime() {
169         return mFreezeUnfreezeTime;
170     }
171 
172     @GuardedBy("mProcLock")
setFreezeUnfreezeTime(long freezeUnfreezeTime)173     void setFreezeUnfreezeTime(long freezeUnfreezeTime) {
174         mFreezeUnfreezeTime = freezeUnfreezeTime;
175     }
176 
177     @GuardedBy("mProcLock")
shouldNotFreeze()178     boolean shouldNotFreeze() {
179         return mShouldNotFreeze;
180     }
181 
182     @GuardedBy("mProcLock")
setShouldNotFreeze(boolean shouldNotFreeze)183     void setShouldNotFreeze(boolean shouldNotFreeze) {
184         mShouldNotFreeze = shouldNotFreeze;
185     }
186 
187     @GuardedBy("mProcLock")
isFreezeExempt()188     boolean isFreezeExempt() {
189         return mFreezeExempt;
190     }
191 
192     @GuardedBy("mProcLock")
setPendingFreeze(boolean freeze)193     void setPendingFreeze(boolean freeze) {
194         mPendingFreeze = freeze;
195     }
196 
197     @GuardedBy("mProcLock")
isPendingFreeze()198     boolean isPendingFreeze() {
199         return mPendingFreeze;
200     }
201 
202     @GuardedBy("mProcLock")
setFreezeExempt(boolean exempt)203     void setFreezeExempt(boolean exempt) {
204         mFreezeExempt = exempt;
205     }
206 
ProcessCachedOptimizerRecord(ProcessRecord app)207     ProcessCachedOptimizerRecord(ProcessRecord app) {
208         mApp = app;
209         mProcLock = app.mService.mProcLock;
210     }
211 
init(long nowUptime)212     void init(long nowUptime) {
213         mFreezeUnfreezeTime = nowUptime;
214     }
215 
216     @GuardedBy("mProcLock")
dump(PrintWriter pw, String prefix, long nowUptime)217     void dump(PrintWriter pw, String prefix, long nowUptime) {
218         pw.print(prefix); pw.print("lastCompactTime="); pw.print(mLastCompactTime);
219         pw.print(" lastCompactAction="); pw.println(mLastCompactAction);
220         pw.print(prefix);
221         pw.print("hasPendingCompaction=");
222         pw.print(mPendingCompact);
223         pw.print(prefix); pw.print("isFreezeExempt="); pw.print(mFreezeExempt);
224         pw.print(" isPendingFreeze="); pw.print(mPendingFreeze);
225         pw.print(" " + IS_FROZEN + "="); pw.println(mFrozen);
226     }
227 }
228