summaryrefslogtreecommitdiffstats
path: root/services/camera
diff options
context:
space:
mode:
authorIgor Murashkin <iam@google.com>2012-10-03 16:02:09 -0700
committerIgor Murashkin <iam@google.com>2012-10-03 16:48:48 -0700
commit04273cb14d2326e85bb047ea6ef75294c8b3d561 (patch)
tree88ad9452e7ec70825d15b5c179d06e4268eab939 /services/camera
parentc20630569431234db23b6182dd17102023dee68e (diff)
downloadframeworks_av-04273cb14d2326e85bb047ea6ef75294c8b3d561.zip
frameworks_av-04273cb14d2326e85bb047ea6ef75294c8b3d561.tar.gz
frameworks_av-04273cb14d2326e85bb047ea6ef75294c8b3d561.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
Diffstat (limited to 'services/camera')
-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) {