From 0f19cc3e903c2580a01e131dc3e09606854f1bd6 Mon Sep 17 00:00:00 2001 From: Avichal Rakesh Date: Tue, 3 May 2022 16:17:13 -0700 Subject: [PATCH] Ensure that two threads cannot simultaneously close SurfaceImage SurfaceImage's `close` method is not thread safe but can be called by multiple threads. If two threads call `SurfaceImage#close` simulatneously, it can cause ImageReader to throw IllegalArgumentException. This CL synchronizes the `close` method to prevent spurious exceptions from being thrown when multiple threads attempt to close a SurfaceImage. Bug: 223447712 Test: All existing CTS tests pass on Oriole Change-Id: I49426b771736e378862e1550124e65c26f5d7c1b --- media/java/android/media/ImageReader.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/media/java/android/media/ImageReader.java b/media/java/android/media/ImageReader.java index 70d6810d01ec8..472586b5e5192 100644 --- a/media/java/android/media/ImageReader.java +++ b/media/java/android/media/ImageReader.java @@ -643,6 +643,9 @@ public class ImageReader implements AutoCloseable { /** *

Return the frame to the ImageReader for reuse.

+ * + * This method should only be called via {@link SurfaceImage#close} which ensures that image + * closing is atomic. */ private void releaseImage(Image i) { if (! (i instanceof SurfaceImage) ) { @@ -1125,6 +1128,8 @@ public class ImageReader implements AutoCloseable { } private class SurfaceImage extends android.media.Image { + private final Object mCloseLock = new Object(); + public SurfaceImage(int format) { mFormat = format; mHardwareBufferFormat = ImageReader.this.mHardwareBufferFormat; @@ -1139,7 +1144,9 @@ public class ImageReader implements AutoCloseable { @Override public void close() { - ImageReader.this.releaseImage(this); + synchronized (this.mCloseLock) { + ImageReader.this.releaseImage(this); + } } public ImageReader getReader() {