OSDN Git Service

Make CameraDeviceImpl#close() idempotent (for real).
authorRuben Brunk <rubenbrunk@google.com>
Thu, 11 Jun 2015 23:12:35 +0000 (16:12 -0700)
committerRuben Brunk <rubenbrunk@google.com>
Thu, 11 Jun 2015 23:12:35 +0000 (16:12 -0700)
- Also fixes onClosed() implementation in CameraDeviceImpl;
  this would never return true previously.

Bug: 21698939
Change-Id: I4dd56a1410b9fc64152acc5296514f5841794fa9

core/java/android/hardware/camera2/impl/CameraDeviceImpl.java

index c073ba5..1f75562 100644 (file)
@@ -52,6 +52,7 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -79,7 +80,7 @@ public class CameraDeviceImpl extends CameraDevice {
     private volatile StateCallbackKK mSessionStateCallback;
     private final Handler mDeviceHandler;
 
-    private volatile boolean mClosing = false;
+    private final AtomicBoolean mClosing = new AtomicBoolean();
     private boolean mInError = false;
     private boolean mIdle = true;
 
@@ -906,6 +907,10 @@ public class CameraDeviceImpl extends CameraDevice {
     @Override
     public void close() {
         synchronized (mInterfaceLock) {
+            if (mClosing.getAndSet(true)) {
+                return;
+            }
+
             try {
                 if (mRemoteDevice != null) {
                     mRemoteDevice.disconnect();
@@ -1917,7 +1922,7 @@ public class CameraDeviceImpl extends CameraDevice {
 
     /** Whether the camera device has started to close (may not yet have finished) */
     private boolean isClosed() {
-        return mClosing;
+        return mClosing.get();
     }
 
     private CameraCharacteristics getCharacteristics() {