Merge "Cleanup in EmulatorClipboardMonitor (2)" into tm-dev am: ddd9f92266

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/18360036

Change-Id: I0fdb569f4213f96d43bec2c9248c8c5235b27ff6
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
TreeHugger Robot
2022-05-13 08:55:59 +00:00
committed by Automerger Merge Worker

View File

@@ -60,11 +60,11 @@ class EmulatorClipboardMonitor implements Consumer<ClipData> {
return mPipe; return mPipe;
} }
private synchronized boolean openPipe() { private synchronized void setPipeFD(final FileDescriptor fd) {
if (mPipe != null) { mPipe = fd;
return true;
} }
private static FileDescriptor openPipeImpl() {
try { try {
final FileDescriptor fd = Os.socket(OsConstants.AF_VSOCK, OsConstants.SOCK_STREAM, 0); final FileDescriptor fd = Os.socket(OsConstants.AF_VSOCK, OsConstants.SOCK_STREAM, 0);
@@ -73,15 +73,32 @@ class EmulatorClipboardMonitor implements Consumer<ClipData> {
final byte[] handshake = createOpenHandshake(); final byte[] handshake = createOpenHandshake();
writeFully(fd, handshake, 0, handshake.length); writeFully(fd, handshake, 0, handshake.length);
mPipe = fd; return fd;
return true;
} catch (ErrnoException | SocketException | InterruptedIOException e) { } catch (ErrnoException | SocketException | InterruptedIOException e) {
Os.close(fd); Os.close(fd);
} }
} catch (ErrnoException e) { } 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() { private synchronized void closePipe() {
@@ -125,12 +142,7 @@ class EmulatorClipboardMonitor implements Consumer<ClipData> {
this.mHostMonitorThread = new Thread(() -> { this.mHostMonitorThread = new Thread(() -> {
while (!Thread.interrupted()) { while (!Thread.interrupted()) {
try { try {
// There's no guarantee that QEMU pipes will be ready at the moment openPipe();
// this method is invoked. We simply try to get the pipe open and
// retry on failure indefinitely.
while (!openPipe()) {
Thread.sleep(100);
}
final byte[] receivedData = receiveMessage(); final byte[] receivedData = receiveMessage();