diff options
author | Igor Murashkin <iam@google.com> | 2012-10-03 16:02:09 -0700 |
---|---|---|
committer | Igor Murashkin <iam@google.com> | 2012-10-03 16:48:48 -0700 |
commit | 04273cb14d2326e85bb047ea6ef75294c8b3d561 (patch) | |
tree | 88ad9452e7ec70825d15b5c179d06e4268eab939 /services/camera | |
parent | c20630569431234db23b6182dd17102023dee68e (diff) | |
download | frameworks_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.cpp | 22 |
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) { |