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

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

Merge "Don't dump print state while holding lock"

parents 78ec6b8e 4b89d63b
Loading
Loading
Loading
Loading
+27 −28
Original line number Diff line number Diff line
@@ -63,6 +63,7 @@ import com.android.server.SystemService;

import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

@@ -645,7 +646,6 @@ public final class PrintManagerService extends SystemService {

            int opti = 0;
            boolean dumpAsProto = false;
            int user = UserHandle.USER_ALL;
            while (opti < args.length) {
                String opt = args[opti];
                if (opt == null || opt.length() <= 0 || opt.charAt(0) != '-') {
@@ -659,50 +659,49 @@ public final class PrintManagerService extends SystemService {
                }
            }

            ArrayList<UserState> userStatesToDump = new ArrayList<>();
            synchronized (mLock) {
                int numUserStates = mUserStates.size();
                for (int i = 0; i < numUserStates; i++) {
                    userStatesToDump.add(mUserStates.valueAt(i));
                }
            }

            final long identity = Binder.clearCallingIdentity();
            try {
                if (dumpAsProto) {
                        dumpLocked(new ProtoOutputStream(fd), UserHandle.of(user));
                    dump(new ProtoOutputStream(fd), userStatesToDump);
                } else {
                        dumpLocked(fd, pw, UserHandle.of(user));
                    dump(fd, pw, userStatesToDump);
                }
            } finally {
                Binder.restoreCallingIdentity(identity);
            }
        }
        }

        private void dumpLocked(@NonNull ProtoOutputStream proto, @NonNull UserHandle user) {
            final int userStateCount = mUserStates.size();
        private void dump(@NonNull ProtoOutputStream proto,
                @NonNull ArrayList<UserState> userStatesToDump) {
            final int userStateCount = userStatesToDump.size();
            for (int i = 0; i < userStateCount; i++) {
                UserState userState = mUserStates.valueAt(i);

                if (user.equals(UserHandle.ALL) || mUserStates.keyAt(i) == user.getIdentifier()) {
                long token = proto.start(PrintServiceDumpProto.USER_STATES);
                    userState.dump(proto);
                userStatesToDump.get(i).dump(proto);
                proto.end(token);
            }
            }

            proto.flush();
        }

        private void dumpLocked(@NonNull FileDescriptor fd, @NonNull PrintWriter pw,
                @NonNull UserHandle user) {
        private void dump(@NonNull FileDescriptor fd, @NonNull PrintWriter pw,
                @NonNull ArrayList<UserState> userStatesToDump) {
            pw = Preconditions.checkNotNull(pw);

            pw.println("PRINT MANAGER STATE (dumpsys print)");
            final int userStateCount = mUserStates.size();
            final int userStateCount = userStatesToDump.size();
            for (int i = 0; i < userStateCount; i++) {
                UserState userState = mUserStates.valueAt(i);

                if (user.equals(UserHandle.ALL) || mUserStates.keyAt(i) == user.getIdentifier()) {
                    userState.dump(fd, pw, "");
                userStatesToDump.get(i).dump(fd, pw, "");
                pw.println();
            }
        }
        }

        private void registerContentObservers() {
            final Uri enabledPrintServicesUri = Settings.Secure.getUriFor(