summaryrefslogtreecommitdiffstats
path: root/services
diff options
context:
space:
mode:
authorEino-Ville Talvala <etalvala@google.com>2012-10-19 17:21:46 -0700
committerAndroid Git Automerger <android-git-automerger@android.com>2012-10-19 17:21:46 -0700
commitcffeb15b9bf85657a2b03398cac3e3085cfdbdb2 (patch)
tree87fd1b342b4857361ed84a3f66d4b6f8f3c532e4 /services
parentb362889b89e99efe96928effc70db3746b1f89d9 (diff)
parente50ba28aa1846a7c2a296f122a5675476dacc4a5 (diff)
downloadframeworks_av-cffeb15b9bf85657a2b03398cac3e3085cfdbdb2.zip
frameworks_av-cffeb15b9bf85657a2b03398cac3e3085cfdbdb2.tar.gz
frameworks_av-cffeb15b9bf85657a2b03398cac3e3085cfdbdb2.tar.bz2
am e50ba28a: am 9e760d66: Merge "Camera2: Fix potential deadlock" into jb-mr1-dev
* commit 'e50ba28aa1846a7c2a296f122a5675476dacc4a5': Camera2: Fix potential deadlock
Diffstat (limited to 'services')
-rw-r--r--services/camera/libcameraservice/Camera2Client.cpp18
1 files changed, 11 insertions, 7 deletions
diff --git a/services/camera/libcameraservice/Camera2Client.cpp b/services/camera/libcameraservice/Camera2Client.cpp
index 98332f9..0675400 100644
--- a/services/camera/libcameraservice/Camera2Client.cpp
+++ b/services/camera/libcameraservice/Camera2Client.cpp
@@ -529,15 +529,19 @@ status_t Camera2Client::setPreviewWindowL(const sp<IBinder>& binder,
return NO_ERROR;
}
- SharedParameters::Lock l(mParameters);
- switch (l.mParameters.state) {
+ Parameters::State state;
+ {
+ SharedParameters::Lock l(mParameters);
+ state = l.mParameters.state;
+ }
+ switch (state) {
case Parameters::DISCONNECTED:
case Parameters::RECORD:
case Parameters::STILL_CAPTURE:
case Parameters::VIDEO_SNAPSHOT:
ALOGE("%s: Camera %d: Cannot set preview display while in state %s",
__FUNCTION__, mCameraId,
- Parameters::getStateName(l.mParameters.state));
+ Parameters::getStateName(state));
return INVALID_OPERATION;
case Parameters::STOPPED:
case Parameters::WAITING_FOR_PREVIEW_WINDOW:
@@ -545,10 +549,8 @@ status_t Camera2Client::setPreviewWindowL(const sp<IBinder>& binder,
break;
case Parameters::PREVIEW:
// Already running preview - need to stop and create a new stream
- // TODO: Optimize this so that we don't wait for old stream to drain
- // before spinning up new stream
mStreamingProcessor->stopStream();
- l.mParameters.state = Parameters::WAITING_FOR_PREVIEW_WINDOW;
+ state = Parameters::WAITING_FOR_PREVIEW_WINDOW;
break;
}
@@ -560,7 +562,9 @@ status_t Camera2Client::setPreviewWindowL(const sp<IBinder>& binder,
return res;
}
- if (l.mParameters.state == Parameters::WAITING_FOR_PREVIEW_WINDOW) {
+ if (state == Parameters::WAITING_FOR_PREVIEW_WINDOW) {
+ SharedParameters::Lock l(mParameters);
+ l.mParameters.state = state;
return startPreviewL(l.mParameters, false);
}