summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Roman Kiryanov <rkir@google.com> 2022-05-11 21:57:50 -0700
committer Roman Kiryanov <rkir@google.com> 2022-05-11 22:44:00 -0700
commit6269c53d3926f24e9b7b901b0c41d21c181a76ae (patch)
tree5d34f68f81e1d3fb901005edcbd1b6c7561145c4
parenta1e0480b6400cf8c758f6035bcab351ddf7a67f4 (diff)
Cleanup in EmulatorClipboardMonitor (3)
make more functions static, less places to mess with the global state. Bug: 231345789 Test: presubmit Signed-off-by: Roman Kiryanov <rkir@google.com> Change-Id: I236b039c4fbbbfb519ba1432326bba9a89d008c2
-rw-r--r--services/core/java/com/android/server/clipboard/EmulatorClipboardMonitor.java63
1 files changed, 31 insertions, 32 deletions
diff --git a/services/core/java/com/android/server/clipboard/EmulatorClipboardMonitor.java b/services/core/java/com/android/server/clipboard/EmulatorClipboardMonitor.java
index 44822a3f7429..f39bdfe68b31 100644
--- a/services/core/java/com/android/server/clipboard/EmulatorClipboardMonitor.java
+++ b/services/core/java/com/android/server/clipboard/EmulatorClipboardMonitor.java
@@ -83,45 +83,31 @@ class EmulatorClipboardMonitor implements Consumer<ClipData> {
return null;
}
- private void openPipe() throws InterruptedException {
- FileDescriptor fd = getPipeFD();
-
- if (fd == null) {
+ private static FileDescriptor openPipe() throws InterruptedException {
+ FileDescriptor fd = openPipeImpl();
+
+ // There's no guarantee that QEMU pipes will be ready at the moment
+ // this method is invoked. We simply try to get the pipe open and
+ // retry on failure indefinitely.
+ while (fd == null) {
+ Thread.sleep(100);
fd = openPipeImpl();
-
- // There's no guarantee that QEMU pipes will be ready at the moment
- // this method is invoked. We simply try to get the pipe open and
- // retry on failure indefinitely.
- while (fd == null) {
- Thread.sleep(100);
- fd = openPipeImpl();
- }
}
- setPipeFD(fd);
+ return fd;
}
- private synchronized void closePipe() {
- try {
- final FileDescriptor fd = mPipe;
- mPipe = null;
- if (fd != null) {
- Os.close(fd);
- }
- } catch (ErrnoException ignore) {
- }
- }
-
- private byte[] receiveMessage() throws ErrnoException, InterruptedIOException, EOFException {
+ private static byte[] receiveMessage(final FileDescriptor fd) throws ErrnoException,
+ InterruptedIOException, EOFException {
final byte[] lengthBits = new byte[4];
- readFully(mPipe, lengthBits, 0, lengthBits.length);
+ readFully(fd, lengthBits, 0, lengthBits.length);
final ByteBuffer bb = ByteBuffer.wrap(lengthBits);
bb.order(ByteOrder.LITTLE_ENDIAN);
final int msgLen = bb.getInt();
final byte[] msg = new byte[msgLen];
- readFully(mPipe, msg, 0, msg.length);
+ readFully(fd, msg, 0, msg.length);
return msg;
}
@@ -140,11 +126,16 @@ class EmulatorClipboardMonitor implements Consumer<ClipData> {
EmulatorClipboardMonitor(final Consumer<ClipData> setAndroidClipboard) {
this.mHostMonitorThread = new Thread(() -> {
+ FileDescriptor fd = null;
+
while (!Thread.interrupted()) {
try {
- openPipe();
+ if (fd == null) {
+ fd = openPipe();
+ setPipeFD(fd);
+ }
- final byte[] receivedData = receiveMessage();
+ final byte[] receivedData = receiveMessage(fd);
final String str = new String(receivedData);
final ClipData clip = new ClipData("host clipboard",
@@ -158,9 +149,17 @@ class EmulatorClipboardMonitor implements Consumer<ClipData> {
Slog.i(TAG, "Setting the guest clipboard to '" + str + "'");
}
setAndroidClipboard.accept(clip);
- } catch (ErrnoException | EOFException | InterruptedIOException e) {
- closePipe();
- } catch (InterruptedException | IllegalArgumentException e) {
+ } catch (ErrnoException | EOFException | InterruptedIOException
+ | InterruptedException e) {
+ setPipeFD(null);
+
+ try {
+ Os.close(fd);
+ } catch (ErrnoException e2) {
+ // ignore
+ }
+
+ fd = null;
}
}
});