Merge "RESTRICT AUTOMERGE Ensure caller identity is restored in CP quick-path." into qt-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
76a6546f5a
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user