summaryrefslogtreecommitdiffstats
path: root/services
diff options
context:
space:
mode:
authorEino-Ville Talvala <etalvala@google.com>2013-06-14 08:35:48 -0700
committerAndroid Git Automerger <android-git-automerger@android.com>2013-06-14 08:35:48 -0700
commite4a453d4b7563d1dab674df6ce52c291e63c6ca7 (patch)
treeb642943cde0238fae15eced34bb7447e6eb1f05e /services
parent767227fcac7be843b338473954420d390e354bf7 (diff)
parent214a17fd37ef85fc841d3157b1e9096e1aa1b42f (diff)
downloadframeworks_av-e4a453d4b7563d1dab674df6ce52c291e63c6ca7.zip
frameworks_av-e4a453d4b7563d1dab674df6ce52c291e63c6ca7.tar.gz
frameworks_av-e4a453d4b7563d1dab674df6ce52c291e63c6ca7.tar.bz2
am 214a17fd: Camera3: Always close HAL device even in face of errors.
* commit '214a17fd37ef85fc841d3157b1e9096e1aa1b42f': Camera3: Always close HAL device even in face of errors.
Diffstat (limited to 'services')
-rw-r--r--services/camera/libcameraservice/Camera3Device.cpp30
1 files changed, 20 insertions, 10 deletions
diff --git a/services/camera/libcameraservice/Camera3Device.cpp b/services/camera/libcameraservice/Camera3Device.cpp
index 6ee6901..cc7802b 100644
--- a/services/camera/libcameraservice/Camera3Device.cpp
+++ b/services/camera/libcameraservice/Camera3Device.cpp
@@ -181,24 +181,29 @@ status_t Camera3Device::disconnect() {
ALOGV("%s: E", __FUNCTION__);
- status_t res;
- if (mStatus == STATUS_UNINITIALIZED) return OK;
+ status_t res = OK;
+ if (mStatus == STATUS_UNINITIALIZED) return res;
if (mStatus == STATUS_ACTIVE ||
(mStatus == STATUS_ERROR && mRequestThread != NULL)) {
res = mRequestThread->clearRepeatingRequests();
if (res != OK) {
SET_ERR_L("Can't stop streaming");
- return res;
- }
- res = waitUntilDrainedLocked();
- if (res != OK) {
- SET_ERR_L("Timeout waiting for HAL to drain");
- return res;
+ // Continue to close device even in case of error
+ } else {
+ res = waitUntilDrainedLocked();
+ if (res != OK) {
+ SET_ERR_L("Timeout waiting for HAL to drain");
+ // Continue to close device even in case of error
+ }
}
}
assert(mStatus == STATUS_IDLE || mStatus == STATUS_ERROR);
+ if (mStatus == STATUS_ERROR) {
+ CLOGE("Shutting down in an error state");
+ }
+
if (mRequestThread != NULL) {
mRequestThread->requestExit();
}
@@ -207,7 +212,12 @@ status_t Camera3Device::disconnect() {
mInputStream.clear();
if (mRequestThread != NULL) {
- mRequestThread->join();
+ if (mStatus != STATUS_ERROR) {
+ // HAL may be in a bad state, so waiting for request thread
+ // (which may be stuck in the HAL processCaptureRequest call)
+ // could be dangerous.
+ mRequestThread->join();
+ }
mRequestThread.clear();
}
@@ -219,7 +229,7 @@ status_t Camera3Device::disconnect() {
mStatus = STATUS_UNINITIALIZED;
ALOGV("%s: X", __FUNCTION__);
- return OK;
+ return res;
}
status_t Camera3Device::dump(int fd, const Vector<String16> &args) {