summaryrefslogtreecommitdiffstats
path: root/services
diff options
context:
space:
mode:
authorEino-Ville Talvala <etalvala@google.com>2015-08-30 04:34:18 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2015-08-30 04:34:18 +0000
commit5dc3d9928f85580a2351925b5f11ff0189524c39 (patch)
tree86c27b6ea458280fec4333fb6baf32ecb6339f2c /services
parent3b86306943e199e000302eec1902fc51be2e0637 (diff)
parentefff1c4ba2bf195d97de2fd5718b708e4b942901 (diff)
downloadframeworks_av-5dc3d9928f85580a2351925b5f11ff0189524c39.zip
frameworks_av-5dc3d9928f85580a2351925b5f11ff0189524c39.tar.gz
frameworks_av-5dc3d9928f85580a2351925b5f11ff0189524c39.tar.bz2
Merge "Camera3Device: Don't hold mutex during HAL device close." into mnc-dr-dev
Diffstat (limited to 'services')
-rw-r--r--services/camera/libcameraservice/device3/Camera3Device.cpp20
1 files changed, 14 insertions, 6 deletions
diff --git a/services/camera/libcameraservice/device3/Camera3Device.cpp b/services/camera/libcameraservice/device3/Camera3Device.cpp
index e4d75cb..ec3591f 100644
--- a/services/camera/libcameraservice/device3/Camera3Device.cpp
+++ b/services/camera/libcameraservice/device3/Camera3Device.cpp
@@ -285,19 +285,27 @@ status_t Camera3Device::disconnect() {
mStatusTracker->join();
}
+ camera3_device_t *hal3Device;
{
Mutex::Autolock l(mLock);
mRequestThread.clear();
mStatusTracker.clear();
- if (mHal3Device != NULL) {
- ATRACE_BEGIN("camera3->close");
- mHal3Device->common.close(&mHal3Device->common);
- ATRACE_END();
- mHal3Device = NULL;
- }
+ hal3Device = mHal3Device;
+ }
+
+ // Call close without internal mutex held, as the HAL close may need to
+ // wait on assorted callbacks,etc, to complete before it can return.
+ if (hal3Device != NULL) {
+ ATRACE_BEGIN("camera3->close");
+ hal3Device->common.close(&hal3Device->common);
+ ATRACE_END();
+ }
+ {
+ Mutex::Autolock l(mLock);
+ mHal3Device = NULL;
internalUpdateStatusLocked(STATUS_UNINITIALIZED);
}