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

Commit 8b64d158 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Copy appop modes on write to avoid locked IO"

parents cd2dbe7d 11b706c7
Loading
Loading
Loading
Loading
+36 −15
Original line number Diff line number Diff line
@@ -2973,18 +2973,40 @@ public class AppOpsService extends IAppOpsService.Stub {
                out.startTag(null, "app-ops");
                out.attribute(null, "v", String.valueOf(CURRENT_VERSION));

                SparseArray<SparseIntArray> uidStatesClone;
                synchronized (this) {
                    uidStatesClone = new SparseArray<>(mUidStates.size());

                    final int uidStateCount = mUidStates.size();
                    for (int i = 0; i < uidStateCount; i++) {
                        UidState uidState = mUidStates.valueAt(i);
                        if (uidState.opModes != null && uidState.opModes.size() > 0) {
                    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.attribute(null, "n", Integer.toString(uidState.uid));
                            SparseIntArray uidOpModes = uidState.opModes;
                            final int opCount = uidOpModes.size();
                            for (int j = 0; j < opCount; j++) {
                                final int op = uidOpModes.keyAt(j);
                                final int mode = uidOpModes.valueAt(j);
                        out.attribute(null, "n",
                                Integer.toString(uidStatesClone.keyAt(uidStateNum)));
                        final int opCount = opModes.size();
                        for (int opCountNum = 0; opCountNum < opCount; opCountNum++) {
                            final int op = opModes.keyAt(opCountNum);
                            final int mode = opModes.valueAt(opCountNum);
                            out.startTag(null, "op");
                            out.attribute(null, "n", Integer.toString(op));
                            out.attribute(null, "m", Integer.toString(mode));
@@ -2993,7 +3015,6 @@ public class AppOpsService extends IAppOpsService.Stub {
                        out.endTag(null, "uid");
                    }
                }
                }

                if (allOps != null) {
                    String lastPkg = null;