am 41b82609: am dd861689: Merge change I05fd0df0 into eclair

Merge commit '41b8260914746d05e1333cfcf228cc8c0a2380b9' into eclair-mr2-plus-aosp

* commit '41b8260914746d05e1333cfcf228cc8c0a2380b9':
  Fix potential deadlock in stopPreview/stopRecord.
This commit is contained in:
Dave Sparks
2009-11-11 17:26:01 -08:00
committed by Android Git Automerger
2 changed files with 46 additions and 29 deletions

View File

@@ -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()) {

View File

@@ -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;
}; };
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------