[DO NOT MERGE] Copy appop modes on write to avoid locked IO

Test: presubmit
Bug: 137528177
Change-Id: I229b361f4950f2184f56f4cd60d45f495fa832f7
(cherry picked from commit 11b706c77b)
This commit is contained in:
Eugene Susla
2019-08-28 14:28:32 -07:00
parent 676ef1a61c
commit 3454f3e9f9

View File

@@ -2979,17 +2979,40 @@ public class AppOpsService extends IAppOpsService.Stub {
out.startTag(null, "app-ops"); out.startTag(null, "app-ops");
out.attribute(null, "v", String.valueOf(CURRENT_VERSION)); out.attribute(null, "v", String.valueOf(CURRENT_VERSION));
final int uidStateCount = mUidStates.size(); SparseArray<SparseIntArray> uidStatesClone;
for (int i = 0; i < uidStateCount; i++) { synchronized (this) {
UidState uidState = mUidStates.valueAt(i); uidStatesClone = new SparseArray<>(mUidStates.size());
if (uidState.opModes != null && uidState.opModes.size() > 0) {
final int uidStateCount = mUidStates.size();
for (int uidStateNum = 0; uidStateNum < uidStateCount; uidStateNum++) {
UidState uidState = mUidStates.valueAt(uidStateNum);
int uid = mUidStates.keyAt(uidStateNum);
SparseIntArray opModes = uidState.opModes;
if (opModes != null && opModes.size() > 0) {
uidStatesClone.put(uid, new SparseIntArray(opModes.size()));
final int opCount = opModes.size();
for (int opCountNum = 0; opCountNum < opCount; opCountNum++) {
uidStatesClone.get(uid).put(
opModes.keyAt(opCountNum),
opModes.valueAt(opCountNum));
}
}
}
}
final int uidStateCount = uidStatesClone.size();
for (int uidStateNum = 0; uidStateNum < uidStateCount; uidStateNum++) {
SparseIntArray opModes = uidStatesClone.valueAt(uidStateNum);
if (opModes != null && opModes.size() > 0) {
out.startTag(null, "uid"); out.startTag(null, "uid");
out.attribute(null, "n", Integer.toString(uidState.uid)); out.attribute(null, "n",
SparseIntArray uidOpModes = uidState.opModes; Integer.toString(uidStatesClone.keyAt(uidStateNum)));
final int opCount = uidOpModes.size(); final int opCount = opModes.size();
for (int j = 0; j < opCount; j++) { for (int opCountNum = 0; opCountNum < opCount; opCountNum++) {
final int op = uidOpModes.keyAt(j); final int op = opModes.keyAt(opCountNum);
final int mode = uidOpModes.valueAt(j); final int mode = opModes.valueAt(opCountNum);
out.startTag(null, "op"); out.startTag(null, "op");
out.attribute(null, "n", Integer.toString(op)); out.attribute(null, "n", Integer.toString(op));
out.attribute(null, "m", Integer.toString(mode)); out.attribute(null, "m", Integer.toString(mode));