summaryrefslogtreecommitdiff
path: root/core/java/android/os
diff options
context:
space:
mode:
authorTim Murray <timmurray@google.com>2021-06-24 17:13:06 -0700
committerTim Murray <timmurray@google.com>2021-06-25 11:14:53 -0700
commit8c37737cbc5d5a11d78defd330e532a6c3dcdaeb (patch)
tree193b68f279ae0e439e19c5bcfd6537c2318d0d4f /core/java/android/os
parent9b03c1c496649c8fc7b6f994801b8c77dd6803af (diff)
FileBridge: use a ByteBuffer for the temp buffer
Using a direct ByteBuffer allows the buffer to be passed to/from JNI without intermediate copies. Test: FileBridgeTests, apps get installed without allocation churn Bug: 192020559 Change-Id: Ic5965c94ba14de6599af67d2e3bba33cd9996046
Diffstat (limited to 'core/java/android/os')
-rw-r--r--core/java/android/os/FileBridge.java12
1 files changed, 9 insertions, 3 deletions
diff --git a/core/java/android/os/FileBridge.java b/core/java/android/os/FileBridge.java
index 7b84575a8955..9dcdbf93f296 100644
--- a/core/java/android/os/FileBridge.java
+++ b/core/java/android/os/FileBridge.java
@@ -32,6 +32,7 @@ import libcore.io.Streams;
import java.io.FileDescriptor;
import java.io.IOException;
import java.io.OutputStream;
+import java.nio.ByteBuffer;
import java.nio.ByteOrder;
/**
@@ -95,9 +96,11 @@ public class FileBridge extends Thread {
@Override
public void run() {
- final byte[] temp = new byte[8192];
+ final ByteBuffer tempBuffer = ByteBuffer.allocateDirect(8192);
+ final byte[] temp = tempBuffer.hasArray() ? tempBuffer.array() : new byte[8192];
try {
- while (IoBridge.read(mServer.getFileDescriptor(), temp, 0, MSG_LENGTH) == MSG_LENGTH) {
+ while (IoBridge.read(mServer.getFileDescriptor(), temp,
+ 0, MSG_LENGTH) == MSG_LENGTH) {
final int cmd = Memory.peekInt(temp, 0, ByteOrder.BIG_ENDIAN);
if (cmd == CMD_WRITE) {
// Shuttle data into local file
@@ -138,7 +141,10 @@ public class FileBridge extends Thread {
public static class FileBridgeOutputStream extends OutputStream {
private final ParcelFileDescriptor mClientPfd;
private final FileDescriptor mClient;
- private final byte[] mTemp = new byte[MSG_LENGTH];
+ private final ByteBuffer mTempBuffer = ByteBuffer.allocateDirect(MSG_LENGTH);
+ private final byte[] mTemp = mTempBuffer.hasArray()
+ ? mTempBuffer.array()
+ : new byte[MSG_LENGTH];
public FileBridgeOutputStream(ParcelFileDescriptor clientPfd) {
mClientPfd = clientPfd;