[WMS][Bugfix] Fix hang when dumping local window.

Problem:
Window dumping uses pipe for transfering data. This may
cause IO hang when dumping local window if buffer is full.

Solution:
Dump local window in IoThread's executor.

Bug: 267242455
Test: Manual && Monkey Test
Change-Id: I11043a79f03f7f71d0ca1daf8215580535a5d34d
This commit is contained in:
qinyige1
2023-01-18 10:12:13 +08:00
parent 673132ad6b
commit c79b915f70

View File

@@ -34,6 +34,7 @@ import android.content.res.Resources.NotFoundException;
import android.graphics.Color;
import android.graphics.Point;
import android.graphics.Rect;
import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
import android.os.ShellCommand;
import android.os.UserHandle;
@@ -46,6 +47,7 @@ import android.view.ViewDebug;
import com.android.internal.os.ByteTransferPipe;
import com.android.internal.protolog.ProtoLogImpl;
import com.android.server.IoThread;
import com.android.server.wm.LetterboxConfiguration.LetterboxBackgroundType;
import com.android.server.wm.LetterboxConfiguration.LetterboxHorizontalReachabilityPosition;
import com.android.server.wm.LetterboxConfiguration.LetterboxVerticalReachabilityPosition;
@@ -571,8 +573,22 @@ public class WindowManagerShellCommand extends ShellCommand {
ByteTransferPipe pipe = null;
try {
pipe = new ByteTransferPipe();
w.mClient.executeCommand(ViewDebug.REMOTE_COMMAND_DUMP_ENCODED, null,
pipe.getWriteFd());
final ParcelFileDescriptor pfd = pipe.getWriteFd();
if (w.isClientLocal()) {
// Make it asynchronous to avoid writer from being blocked
// by waiting for the buffer to be consumed in the same process.
IoThread.getExecutor().execute(() -> {
try {
w.mClient.executeCommand(
ViewDebug.REMOTE_COMMAND_DUMP_ENCODED, null, pfd);
} catch (RemoteException e) {
// Ignore for local call.
}
});
} else {
w.mClient.executeCommand(
ViewDebug.REMOTE_COMMAND_DUMP_ENCODED, null, pfd);
}
requestList.add(Pair.create(w.getName(), pipe));
} catch (IOException | RemoteException e) {
// Skip this window