summaryrefslogtreecommitdiffstats
path: root/services/camera/libcameraservice/CameraFlashlight.cpp
diff options
context:
space:
mode:
authorRuben Brunk <rubenbrunk@google.com>2015-03-19 05:55:16 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2015-03-19 05:55:16 +0000
commitd58b2ac7244a964caa3f4e386b8280ae2f5d2125 (patch)
tree84ef9b168bd3ab9e33c0532dabf33fe328eba334 /services/camera/libcameraservice/CameraFlashlight.cpp
parent377165c24968b044faccaf366a2377fa32143e2f (diff)
parentcc776718c0be7c31fe5ab4fc1446d377be60369f (diff)
downloadframeworks_av-d58b2ac7244a964caa3f4e386b8280ae2f5d2125.zip
frameworks_av-d58b2ac7244a964caa3f4e386b8280ae2f5d2125.tar.gz
frameworks_av-d58b2ac7244a964caa3f4e386b8280ae2f5d2125.tar.bz2
Merge "camera2: Add camera client eviction enforcement."
Diffstat (limited to 'services/camera/libcameraservice/CameraFlashlight.cpp')
-rw-r--r--services/camera/libcameraservice/CameraFlashlight.cpp14
1 files changed, 14 insertions, 0 deletions
diff --git a/services/camera/libcameraservice/CameraFlashlight.cpp b/services/camera/libcameraservice/CameraFlashlight.cpp
index 7a79750..0def668 100644
--- a/services/camera/libcameraservice/CameraFlashlight.cpp
+++ b/services/camera/libcameraservice/CameraFlashlight.cpp
@@ -110,6 +110,20 @@ status_t CameraFlashlight::setTorchMode(const String8& cameraId, bool enabled) {
status_t res = OK;
Mutex::Autolock l(mLock);
+ if (mOpenedCameraIds.indexOf(cameraId) != NAME_NOT_FOUND) {
+ // This case is needed to avoid state corruption during the following call sequence:
+ // CameraService::setTorchMode for camera ID 0 begins, does torch status checks
+ // CameraService::connect for camera ID 0 begins, calls prepareDeviceOpen, ends
+ // CameraService::setTorchMode for camera ID 0 continues, calls
+ // CameraFlashlight::setTorchMode
+
+ // TODO: Move torch status checks and state updates behind this CameraFlashlight lock
+ // to avoid other similar race conditions.
+ ALOGE("%s: Camera device %s is in use, cannot set torch mode.",
+ __FUNCTION__, cameraId.string());
+ return -EBUSY;
+ }
+
if (mFlashControl == NULL) {
if (enabled == false) {
return OK;