Merge commit '41b8260914746d05e1333cfcf228cc8c0a2380b9' into eclair-mr2-plus-aosp * commit '41b8260914746d05e1333cfcf228cc8c0a2380b9': Fix potential deadlock in stopPreview/stopRecord.
This commit is contained in:
@@ -683,6 +683,8 @@ void CameraService::Client::stopPreview()
|
|||||||
{
|
{
|
||||||
LOGD("stopPreview (pid %d)", getCallingPid());
|
LOGD("stopPreview (pid %d)", getCallingPid());
|
||||||
|
|
||||||
|
// hold main lock during state transition
|
||||||
|
{
|
||||||
Mutex::Autolock lock(mLock);
|
Mutex::Autolock lock(mLock);
|
||||||
if (checkPid() != NO_ERROR) return;
|
if (checkPid() != NO_ERROR) return;
|
||||||
|
|
||||||
@@ -698,14 +700,22 @@ void CameraService::Client::stopPreview()
|
|||||||
if (mSurface != 0 && !mUseOverlay) {
|
if (mSurface != 0 && !mUseOverlay) {
|
||||||
mSurface->unregisterBuffers();
|
mSurface->unregisterBuffers();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// hold preview buffer lock
|
||||||
|
{
|
||||||
|
Mutex::Autolock lock(mPreviewLock);
|
||||||
mPreviewBuffer.clear();
|
mPreviewBuffer.clear();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// stop recording mode
|
// stop recording mode
|
||||||
void CameraService::Client::stopRecording()
|
void CameraService::Client::stopRecording()
|
||||||
{
|
{
|
||||||
LOGD("stopRecording (pid %d)", getCallingPid());
|
LOGD("stopRecording (pid %d)", getCallingPid());
|
||||||
|
|
||||||
|
// hold main lock during state transition
|
||||||
|
{
|
||||||
Mutex::Autolock lock(mLock);
|
Mutex::Autolock lock(mLock);
|
||||||
if (checkPid() != NO_ERROR) return;
|
if (checkPid() != NO_ERROR) return;
|
||||||
|
|
||||||
@@ -722,9 +732,14 @@ void CameraService::Client::stopRecording()
|
|||||||
mHardware->stopRecording();
|
mHardware->stopRecording();
|
||||||
mHardware->disableMsgType(CAMERA_MSG_VIDEO_FRAME);
|
mHardware->disableMsgType(CAMERA_MSG_VIDEO_FRAME);
|
||||||
LOGD("stopRecording(), hardware stopped OK");
|
LOGD("stopRecording(), hardware stopped OK");
|
||||||
|
}
|
||||||
|
|
||||||
|
// hold preview buffer lock
|
||||||
|
{
|
||||||
|
Mutex::Autolock lock(mPreviewLock);
|
||||||
mPreviewBuffer.clear();
|
mPreviewBuffer.clear();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// release a recording frame
|
// release a recording frame
|
||||||
void CameraService::Client::releaseRecordingFrame(const sp<IMemory>& mem)
|
void CameraService::Client::releaseRecordingFrame(const sp<IMemory>& mem)
|
||||||
@@ -1216,10 +1231,10 @@ void CameraService::Client::copyFrameAndPostCopiedFrame(const sp<ICameraClient>&
|
|||||||
// provided it's big enough. Don't allocate the memory or
|
// provided it's big enough. Don't allocate the memory or
|
||||||
// perform the copy if there's no callback.
|
// perform the copy if there's no callback.
|
||||||
|
|
||||||
// hold the lock while we grab a reference to the preview buffer
|
// hold the preview lock while we grab a reference to the preview buffer
|
||||||
sp<MemoryHeapBase> previewBuffer;
|
sp<MemoryHeapBase> previewBuffer;
|
||||||
{
|
{
|
||||||
Mutex::Autolock lock(mLock);
|
Mutex::Autolock lock(mPreviewLock);
|
||||||
if (mPreviewBuffer == 0) {
|
if (mPreviewBuffer == 0) {
|
||||||
mPreviewBuffer = new MemoryHeapBase(size, 0, NULL);
|
mPreviewBuffer = new MemoryHeapBase(size, 0, NULL);
|
||||||
} else if (size > mPreviewBuffer->virtualSize()) {
|
} else if (size > mPreviewBuffer->virtualSize()) {
|
||||||
|
|||||||
@@ -181,7 +181,6 @@ private:
|
|||||||
mutable Condition mReady;
|
mutable Condition mReady;
|
||||||
sp<CameraService> mCameraService;
|
sp<CameraService> mCameraService;
|
||||||
sp<ISurface> mSurface;
|
sp<ISurface> mSurface;
|
||||||
sp<MemoryHeapBase> mPreviewBuffer;
|
|
||||||
int mPreviewCallbackFlag;
|
int mPreviewCallbackFlag;
|
||||||
|
|
||||||
sp<MediaPlayer> mMediaPlayerClick;
|
sp<MediaPlayer> mMediaPlayerClick;
|
||||||
@@ -197,6 +196,9 @@ private:
|
|||||||
sp<OverlayRef> mOverlayRef;
|
sp<OverlayRef> mOverlayRef;
|
||||||
int mOverlayW;
|
int mOverlayW;
|
||||||
int mOverlayH;
|
int mOverlayH;
|
||||||
|
|
||||||
|
mutable Mutex mPreviewLock;
|
||||||
|
sp<MemoryHeapBase> mPreviewBuffer;
|
||||||
};
|
};
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|||||||
Reference in New Issue
Block a user