Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0f19cc3e authored by Avichal Rakesh's avatar Avichal Rakesh
Browse files

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
parent 476efd5f
Loading
Loading
Loading
Loading
+8 −1
Original line number Diff line number Diff line
@@ -643,6 +643,9 @@ public class ImageReader implements AutoCloseable {

    /**
     * <p>Return the frame to the ImageReader for reuse.</p>
     *
     * 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,8 +1144,10 @@ public class ImageReader implements AutoCloseable {

        @Override
        public void close() {
            synchronized (this.mCloseLock) {
                ImageReader.this.releaseImage(this);
            }
        }

        public ImageReader getReader() {
            return ImageReader.this;