diff options
author | Eino-Ville Talvala <etalvala@google.com> | 2012-10-19 17:21:46 -0700 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2012-10-19 17:21:46 -0700 |
commit | cffeb15b9bf85657a2b03398cac3e3085cfdbdb2 (patch) | |
tree | 87fd1b342b4857361ed84a3f66d4b6f8f3c532e4 /services | |
parent | b362889b89e99efe96928effc70db3746b1f89d9 (diff) | |
parent | e50ba28aa1846a7c2a296f122a5675476dacc4a5 (diff) | |
download | frameworks_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.cpp | 18 |
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); } |