summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIgor Murashkin <iam@google.com>2012-10-03 16:02:09 -0700
committerThe Android Automerger <android-build@android.com>2012-10-04 18:13:29 -0700
commitc10ea778f589283d67ede3a0e1c10ab960962e77 (patch)
tree0f50e30b831044b06d09195d11ad87724b4a822b
parent8f0e26366934d6acc8fa0fce21e95425f16f7650 (diff)
downloadframeworks_av-c10ea778f589283d67ede3a0e1c10ab960962e77.zip
frameworks_av-c10ea778f589283d67ede3a0e1c10ab960962e77.tar.gz
frameworks_av-c10ea778f589283d67ede3a0e1c10ab960962e77.tar.bz2
Camera2: Fix deadlock while zooming during record
Acquired SharedParameters before mMutex in StreamingProcessor, this avoids any potential deadlocks since Camera2Client code would always acquire SharedParameters first before invoking StreamingProcessor. Bug: 7275259 Change-Id: Ia741162c455300378bee049f063590ece5328b95
-rw-r--r--services/camera/libcameraservice/camera2/StreamingProcessor.cpp22
1 files changed, 11 insertions, 11 deletions
diff --git a/services/camera/libcameraservice/camera2/StreamingProcessor.cpp b/services/camera/libcameraservice/camera2/StreamingProcessor.cpp
index 744b7ed..8921172 100644
--- a/services/camera/libcameraservice/camera2/StreamingProcessor.cpp
+++ b/services/camera/libcameraservice/camera2/StreamingProcessor.cpp
@@ -422,6 +422,9 @@ void StreamingProcessor::onFrameAvailable() {
if (client == 0) return;
{
+ /* acquire SharedParameters before mMutex so we don't dead lock
+ with Camera2Client code calling into StreamingProcessor */
+ SharedParameters::Lock l(client->getParameters());
Mutex::Autolock m(mMutex);
BufferItemConsumer::BufferItem imgBuffer;
res = mRecordingConsumer->acquireBuffer(&imgBuffer);
@@ -435,17 +438,14 @@ void StreamingProcessor::onFrameAvailable() {
mRecordingFrameCount++;
ALOGV("OnRecordingFrame: Frame %d", mRecordingFrameCount);
- {
- SharedParameters::Lock l(client->getParameters());
- // TODO: Signal errors here upstream
- if (l.mParameters.state != Parameters::RECORD &&
- l.mParameters.state != Parameters::VIDEO_SNAPSHOT) {
- ALOGV("%s: Camera %d: Discarding recording image buffers "
- "received after recording done", __FUNCTION__,
- client->getCameraId());
- mRecordingConsumer->releaseBuffer(imgBuffer);
- return;
- }
+ // TODO: Signal errors here upstream
+ if (l.mParameters.state != Parameters::RECORD &&
+ l.mParameters.state != Parameters::VIDEO_SNAPSHOT) {
+ ALOGV("%s: Camera %d: Discarding recording image buffers "
+ "received after recording done", __FUNCTION__,
+ client->getCameraId());
+ mRecordingConsumer->releaseBuffer(imgBuffer);
+ return;
}
if (mRecordingHeap == 0) {