Merge "RESTRICT AUTOMERGE Ensure caller identity is restored in CP quick-path." into qt-dev

This commit is contained in:
Sterling Huber
2020-12-03 00:01:42 +00:00
committed by Android (Google) Code Review

View File

@@ -6831,67 +6831,68 @@ public class ActivityManagerService extends IActivityManager.Stub
"getContentProviderImpl: after checkContentProviderPermission"); "getContentProviderImpl: after checkContentProviderPermission");
final long origId = Binder.clearCallingIdentity(); final long origId = Binder.clearCallingIdentity();
try {
checkTime(startTime, "getContentProviderImpl: incProviderCountLocked");
checkTime(startTime, "getContentProviderImpl: incProviderCountLocked"); // Return the provider instance right away since it already exists.
conn = incProviderCountLocked(r, cpr, token, callingUid, callingPackage,
// In this case the provider instance already exists, so we can callingTag, stable);
// return it right away. if (conn != null && (conn.stableCount+conn.unstableCount) == 1) {
conn = incProviderCountLocked(r, cpr, token, callingUid, callingPackage, callingTag, if (cpr.proc != null && r.setAdj <= ProcessList.PERCEPTIBLE_LOW_APP_ADJ) {
stable); // If this is a perceptible app accessing the provider,
if (conn != null && (conn.stableCount+conn.unstableCount) == 1) { // make sure to count it as being accessed and thus
if (cpr.proc != null && r.setAdj <= ProcessList.PERCEPTIBLE_LOW_APP_ADJ) { // back up on the LRU list. This is good because
// If this is a perceptible app accessing the provider, // content providers are often expensive to start.
// make sure to count it as being accessed and thus checkTime(startTime, "getContentProviderImpl: before updateLruProcess");
// back up on the LRU list. This is good because mProcessList.updateLruProcessLocked(cpr.proc, false, null);
// content providers are often expensive to start. checkTime(startTime, "getContentProviderImpl: after updateLruProcess");
checkTime(startTime, "getContentProviderImpl: before updateLruProcess"); }
mProcessList.updateLruProcessLocked(cpr.proc, false, null);
checkTime(startTime, "getContentProviderImpl: after updateLruProcess");
} }
}
checkTime(startTime, "getContentProviderImpl: before updateOomAdj"); checkTime(startTime, "getContentProviderImpl: before updateOomAdj");
final int verifiedAdj = cpr.proc.verifiedAdj; final int verifiedAdj = cpr.proc.verifiedAdj;
boolean success = updateOomAdjLocked(cpr.proc, true, boolean success = updateOomAdjLocked(cpr.proc, true,
OomAdjuster.OOM_ADJ_REASON_GET_PROVIDER); OomAdjuster.OOM_ADJ_REASON_GET_PROVIDER);
// XXX things have changed so updateOomAdjLocked doesn't actually tell us // XXX things have changed so updateOomAdjLocked doesn't actually tell us
// if the process has been successfully adjusted. So to reduce races with // if the process has been successfully adjusted. So to reduce races with
// it, we will check whether the process still exists. Note that this doesn't // it, we will check whether the process still exists. Note that this doesn't
// completely get rid of races with LMK killing the process, but should make // completely get rid of races with LMK killing the process, but should make
// them much smaller. // them much smaller.
if (success && verifiedAdj != cpr.proc.setAdj && !isProcessAliveLocked(cpr.proc)) { if (success && verifiedAdj != cpr.proc.setAdj
success = false; && !isProcessAliveLocked(cpr.proc)) {
} success = false;
maybeUpdateProviderUsageStatsLocked(r, cpr.info.packageName, name);
checkTime(startTime, "getContentProviderImpl: after updateOomAdj");
if (DEBUG_PROVIDER) Slog.i(TAG_PROVIDER, "Adjust success: " + success);
// NOTE: there is still a race here where a signal could be
// pending on the process even though we managed to update its
// adj level. Not sure what to do about this, but at least
// the race is now smaller.
if (!success) {
// Uh oh... it looks like the provider's process
// has been killed on us. We need to wait for a new
// process to be started, and make sure its death
// doesn't kill our process.
Slog.i(TAG, "Existing provider " + cpr.name.flattenToShortString()
+ " is crashing; detaching " + r);
boolean lastRef = decProviderCountLocked(conn, cpr, token, stable);
checkTime(startTime, "getContentProviderImpl: before appDied");
appDiedLocked(cpr.proc);
checkTime(startTime, "getContentProviderImpl: after appDied");
if (!lastRef) {
// This wasn't the last ref our process had on
// the provider... we have now been killed, bail.
return null;
} }
providerRunning = false; maybeUpdateProviderUsageStatsLocked(r, cpr.info.packageName, name);
conn = null; checkTime(startTime, "getContentProviderImpl: after updateOomAdj");
} else { if (DEBUG_PROVIDER) Slog.i(TAG_PROVIDER, "Adjust success: " + success);
cpr.proc.verifiedAdj = cpr.proc.setAdj; // NOTE: there is still a race here where a signal could be
// pending on the process even though we managed to update its
// adj level. Not sure what to do about this, but at least
// the race is now smaller.
if (!success) {
// Uh oh... it looks like the provider's process
// has been killed on us. We need to wait for a new
// process to be started, and make sure its death
// doesn't kill our process.
Slog.i(TAG, "Existing provider " + cpr.name.flattenToShortString()
+ " is crashing; detaching " + r);
boolean lastRef = decProviderCountLocked(conn, cpr, token, stable);
checkTime(startTime, "getContentProviderImpl: before appDied");
appDiedLocked(cpr.proc);
checkTime(startTime, "getContentProviderImpl: after appDied");
if (!lastRef) {
// This wasn't the last ref our process had on
// the provider... we have now been killed, bail.
return null;
}
providerRunning = false;
conn = null;
} else {
cpr.proc.verifiedAdj = cpr.proc.setAdj;
}
} finally {
Binder.restoreCallingIdentity(origId);
} }
Binder.restoreCallingIdentity(origId);
} }
if (!providerRunning) { if (!providerRunning) {