From 185fd89665b67ef68d64887c65db693cb922f951 Mon Sep 17 00:00:00 2001 From: Roman Kiryanov Date: Wed, 11 May 2022 21:57:43 -0700 Subject: [PATCH] Cleanup in EmulatorClipboardMonitor (2) The whole `openPipe` function does not have to be synchronized. Bug: 231345789 Test: presubmit Signed-off-by: Roman Kiryanov Change-Id: I5241086c947a4227fb32648f0693303be66f4d46 Merged-In: I5241086c947a4227fb32648f0693303be66f4d46 --- .../clipboard/EmulatorClipboardMonitor.java | 38 ++++++++++++------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/services/core/java/com/android/server/clipboard/EmulatorClipboardMonitor.java b/services/core/java/com/android/server/clipboard/EmulatorClipboardMonitor.java index 14259df9879cb..0ccb4554c0574 100644 --- a/services/core/java/com/android/server/clipboard/EmulatorClipboardMonitor.java +++ b/services/core/java/com/android/server/clipboard/EmulatorClipboardMonitor.java @@ -59,11 +59,11 @@ class EmulatorClipboardMonitor implements Consumer { return mPipe; } - private synchronized boolean openPipe() { - if (mPipe != null) { - return true; - } + private synchronized void setPipeFD(final FileDescriptor fd) { + mPipe = fd; + } + private static FileDescriptor openPipeImpl() { try { final FileDescriptor fd = Os.socket(OsConstants.AF_VSOCK, OsConstants.SOCK_STREAM, 0); @@ -72,15 +72,32 @@ class EmulatorClipboardMonitor implements Consumer { final byte[] handshake = createOpenHandshake(); writeFully(fd, handshake, 0, handshake.length); - mPipe = fd; - return true; + return fd; } catch (ErrnoException | SocketException | InterruptedIOException e) { Os.close(fd); } } catch (ErrnoException e) { } - return false; + return null; + } + + private void openPipe() throws InterruptedException { + FileDescriptor fd = getPipeFD(); + + if (fd == null) { + 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); } private synchronized void closePipe() { @@ -124,12 +141,7 @@ class EmulatorClipboardMonitor implements Consumer { this.mHostMonitorThread = new Thread(() -> { while (!Thread.interrupted()) { try { - // 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 (!openPipe()) { - Thread.sleep(100); - } + openPipe(); final byte[] receivedData = receiveMessage();