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

Commit 850c83e6 authored by Jeff Sharkey's avatar Jeff Sharkey
Browse files

Move dump() to dumpAsync(), more oneway calls.

When calling out to dump services hosted by external apps, use
dumpAsync() to avoid hanging if the remote process is wedged.

Test: builds, boots, runs with minimal logs triggered
Bug: 32715088
Change-Id: I70aa2666ae21dae8f09ded2063bed359c0b210c5
parent 0a17db1c
Loading
Loading
Loading
Loading
+20 −10
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.internal.os;

import java.io.Closeable;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileOutputStream;
@@ -32,13 +33,13 @@ import android.util.Slog;
/**
 * Helper for transferring data through a pipe from a client app.
 */
public final class TransferPipe implements Runnable {
public final class TransferPipe implements Runnable, Closeable {
    static final String TAG = "TransferPipe";
    static final boolean DEBUG = false;

    static final long DEFAULT_TIMEOUT = 5000;  // 5 seconds

    final Thread mThread;;
    final Thread mThread;
    final ParcelFileDescriptor[] mFds;

    FileDescriptor mOutFd;
@@ -54,8 +55,13 @@ public final class TransferPipe implements Runnable {
    }

    public TransferPipe() throws IOException {
        this(null);
    }

    public TransferPipe(String bufferPrefix) throws IOException {
        mThread = new Thread(this, "TransferPipe");
        mFds = ParcelFileDescriptor.createPipe();
        mBufferPrefix = bufferPrefix;
    }

    ParcelFileDescriptor getReadFd() {
@@ -70,6 +76,11 @@ public final class TransferPipe implements Runnable {
        mBufferPrefix = prefix;
    }

    public static void dumpAsync(IBinder binder, FileDescriptor out, String[] args)
            throws IOException, RemoteException {
        goDump(binder, out, args);
    }

    static void go(Caller caller, IInterface iface, FileDescriptor out,
            String prefix, String[] args) throws IOException, RemoteException {
        go(caller, iface, out, prefix, args, DEFAULT_TIMEOUT);
@@ -86,12 +97,9 @@ public final class TransferPipe implements Runnable {
            return;
        }

        TransferPipe tp = new TransferPipe();
        try {
        try (TransferPipe tp = new TransferPipe()) {
            caller.go(iface, tp.getWriteFd().getFileDescriptor(), prefix, args);
            tp.go(out, timeout);
        } finally {
            tp.kill();
        }
    }

@@ -111,12 +119,9 @@ public final class TransferPipe implements Runnable {
            return;
        }

        TransferPipe tp = new TransferPipe();
        try {
        try (TransferPipe tp = new TransferPipe()) {
            binder.dumpAsync(tp.getWriteFd().getFileDescriptor(), args);
            tp.go(out, timeout);
        } finally {
            tp.kill();
        }
    }

@@ -173,6 +178,11 @@ public final class TransferPipe implements Runnable {
        }
    }

    @Override
    public void close() {
        kill();
    }

    public void kill() {
        synchronized (this) {
            closeFd(0);
+2 −2
Original line number Diff line number Diff line
@@ -22,7 +22,7 @@ import android.hardware.location.IFusedLocationHardware;
 * Interface definition for Location providers that require FLP services.
 * @hide
 */
interface IFusedProvider {
oneway interface IFusedProvider {
    /**
     * Provides access to a FusedLocationHardware instance needed for the provider to work.
     *
+10 −9
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ import com.android.internal.inputmethod.InputMethodUtils;
import com.android.internal.inputmethod.InputMethodUtils.InputMethodSettings;
import com.android.internal.os.HandlerCaller;
import com.android.internal.os.SomeArgs;
import com.android.internal.os.TransferPipe;
import com.android.internal.util.FastXmlSerializer;
import com.android.internal.view.IInputContext;
import com.android.internal.view.IInputMethod;
@@ -4041,9 +4042,9 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
        if (client != null) {
            pw.flush();
            try {
                client.client.asBinder().dump(fd, args);
            } catch (RemoteException e) {
                p.println("Input method client dead: " + e);
                TransferPipe.dumpAsync(client.client.asBinder(), fd, args);
            } catch (IOException | RemoteException e) {
                p.println("Failed to dump input method client: " + e);
            }
        } else {
            p.println("No input method client.");
@@ -4057,9 +4058,9 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
            p.println(" ");
            pw.flush();
            try {
                focusedWindowClient.client.asBinder().dump(fd, args);
            } catch (RemoteException e) {
                p.println("Input method client in focused window dead: " + e);
                TransferPipe.dumpAsync(focusedWindowClient.client.asBinder(), fd, args);
            } catch (IOException | RemoteException e) {
                p.println("Failed to dump input method client in focused window: " + e);
            }
        }

@@ -4067,9 +4068,9 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
        if (method != null) {
            pw.flush();
            try {
                method.asBinder().dump(fd, args);
            } catch (RemoteException e) {
                p.println("Input method service dead: " + e);
                TransferPipe.dumpAsync(method.asBinder(), fd, args);
            } catch (IOException | RemoteException e) {
                p.println("Failed to dump input method service: " + e);
            }
        } else {
            p.println("No input method service.");
+5 −6
Original line number Diff line number Diff line
@@ -42,8 +42,10 @@ import android.util.Log;
import com.android.internal.R;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.content.PackageMonitor;
import com.android.internal.os.TransferPipe;

import java.io.FileDescriptor;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
@@ -418,12 +420,9 @@ public class NetworkScoreService extends INetworkScoreService.Stub {

        for (INetworkScoreCache scoreCache : getScoreCaches()) {
            try {
                scoreCache.asBinder().dump(fd, args);
            } catch (RemoteException e) {
                writer.println("Unable to dump score cache");
                if (Log.isLoggable(TAG, Log.VERBOSE)) {
                    Log.v(TAG, "Unable to dump score cache", e);
                }
                TransferPipe.dumpAsync(scoreCache.asBinder(), fd, args);
            } catch (IOException | RemoteException e) {
                writer.println("Failed to dump score cache: " + e);
            }
        }
        if (mServiceConnection != null) {
+5 −8
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.server.location;

import java.io.FileDescriptor;
import java.io.IOException;
import java.io.PrintWriter;

import android.content.Context;
@@ -30,6 +31,7 @@ import android.util.Log;
import com.android.internal.location.ProviderProperties;
import com.android.internal.location.ILocationProvider;
import com.android.internal.location.ProviderRequest;
import com.android.internal.os.TransferPipe;
import com.android.server.LocationManagerService;
import com.android.server.ServiceWatcher;

@@ -230,14 +232,9 @@ public class LocationProviderProxy implements LocationProviderInterface {
        pw.flush();

        try {
            service.asBinder().dump(fd, args);
        } catch (RemoteException e) {
            pw.println("service down (RemoteException)");
            Log.w(TAG, e);
        } catch (Exception e) {
            pw.println("service down (Exception)");
            // never let remote service crash system server
            Log.e(TAG, "Exception from " + mServiceWatcher.getBestPackageName(), e);
            TransferPipe.dumpAsync(service.asBinder(), fd, args);
        } catch (IOException | RemoteException e) {
            pw.println("Failed to dump location provider: " + e);
        }
    }

Loading