summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIgor Murashkin <iam@google.com>2012-10-08 15:09:46 -0700
committerIgor Murashkin <iam@google.com>2012-10-08 15:09:46 -0700
commitbe8d28a12e8d08531c6053bcf8ad1183c2f6e6d3 (patch)
tree4ddcbe12b50b6c8782f3d8cecd815f9129ada468
parent2814a4dc0dd45007ce62871af08b98214cd1692c (diff)
downloadframeworks_av-be8d28a12e8d08531c6053bcf8ad1183c2f6e6d3.zip
frameworks_av-be8d28a12e8d08531c6053bcf8ad1183c2f6e6d3.tar.gz
frameworks_av-be8d28a12e8d08531c6053bcf8ad1183c2f6e6d3.tar.bz2
Camera2: Always disconnect in the client destructor
If Camera2Client failed to initialize, it would skip disconnect step, and thus the camera would be forever marked as busy. By always calling disconnect it will always call free. It also adds a new guarantee that Client::disconnect is idempotent Bug: 7298182 Change-Id: Ic9876f1665b7d9b3c0da692880f63f165e3f4fa5
-rw-r--r--services/camera/libcameraservice/CameraService.cpp4
1 files changed, 4 insertions, 0 deletions
diff --git a/services/camera/libcameraservice/CameraService.cpp b/services/camera/libcameraservice/CameraService.cpp
index 6fbd6ed..124d24d 100644
--- a/services/camera/libcameraservice/CameraService.cpp
+++ b/services/camera/libcameraservice/CameraService.cpp
@@ -409,6 +409,9 @@ CameraService::Client::Client(const sp<CameraService>& cameraService,
// tear down the client
CameraService::Client::~Client() {
mCameraService->releaseSound();
+
+ // unconditionally disconnect. function is idempotent
+ Client::disconnect();
}
// ----------------------------------------------------------------------------
@@ -433,6 +436,7 @@ CameraService::Client* CameraService::Client::getClientFromCookie(void* user) {
return client;
}
+// NOTE: function is idempotent
void CameraService::Client::disconnect() {
mCameraService->removeClient(mCameraClient);
mCameraService->setCameraFree(mCameraId);