diff options
| author | 2022-05-11 21:57:50 -0700 | |
|---|---|---|
| committer | 2022-05-11 22:44:00 -0700 | |
| commit | 6269c53d3926f24e9b7b901b0c41d21c181a76ae (patch) | |
| tree | 5d34f68f81e1d3fb901005edcbd1b6c7561145c4 | |
| parent | a1e0480b6400cf8c758f6035bcab351ddf7a67f4 (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.java | 63 |
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; } } }); |