summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Levin <dendy@ti.com>2012-02-03 18:46:44 +0200
committerDaniel Levin <dendy@ti.com>2012-07-25 08:55:39 -0500
commit91672e79b5100ba8f56f9e0c0776b63bcbc3c2bd (patch)
tree066b21a540573b7a2495944436bb1600bf4fd5aa
parentff5a592e57cf5736dda07163a7d376aeb5e38e2c (diff)
downloadhardware_ti_omap4-91672e79b5100ba8f56f9e0c0776b63bcbc3c2bd.zip
hardware_ti_omap4-91672e79b5100ba8f56f9e0c0776b63bcbc3c2bd.tar.gz
hardware_ti_omap4-91672e79b5100ba8f56f9e0c0776b63bcbc3c2bd.tar.bz2
CameraHAL: Fixed accessing deallocated OMX_BUFFERHEADERTYPE
At preview stop step buffers are forced to be flushed from Ducati, so after OMXCameraAdapter::flushBuffers() no OMXCameraAdapterFillBufferDone() callback will be triggered afterward. But because separate thread is used to handle fill buffer done callbacks flushed buffers will be handled with delay. This causes the case when already freed buffer header will be accessed. This patch adds flushing to callbacks thread, waiting until all flushed buffers from Ducati will be processed before exiting the OMXCameraAdapter::flushBuffers() body. This fixes random crashed when looking OMX_OTHER_EXTRADATATYPE in OMX_TI_PLATFORMPRIVATE buffer header section. Signed-off-by: Daniel Levin <dendy@ti.com> Change-Id: I87f9aa3bc4bc02d1e46a4fe2568e063324bc8b79
-rw-r--r--camera/OMXCameraAdapter/OMXCameraAdapter.cpp34
-rw-r--r--camera/inc/OMXCameraAdapter/OMXCameraAdapter.h9
2 files changed, 42 insertions, 1 deletions
diff --git a/camera/OMXCameraAdapter/OMXCameraAdapter.cpp b/camera/OMXCameraAdapter/OMXCameraAdapter.cpp
index 57ce11a..2eb0eaa 100644
--- a/camera/OMXCameraAdapter/OMXCameraAdapter.cpp
+++ b/camera/OMXCameraAdapter/OMXCameraAdapter.cpp
@@ -1030,6 +1030,8 @@ status_t OMXCameraAdapter::flushBuffers()
goto EXIT;
}
+ mOMXCallbackHandler->flush();
+
LOG_FUNCTION_NAME_EXIT;
return (ret | ErrorUtils::omxToAndroidError(eError));
@@ -3442,6 +3444,7 @@ bool OMXCameraAdapter::OMXCallbackHandler::Handler()
{
Mutex::Autolock lock(mLock);
mCommandMsgQ.get(&msg);
+ mIsProcessed = false;
}
switch ( msg.command ) {
@@ -3458,12 +3461,43 @@ bool OMXCameraAdapter::OMXCallbackHandler::Handler()
break;
}
}
+
+ {
+ android::AutoMutex locker(mLock);
+ CAMHAL_UNUSED(locker);
+
+ mIsProcessed = mCommandMsgQ.isEmpty();
+ if ( mIsProcessed )
+ mCondition.signal();
+ }
+ }
+
+ // force the condition to wake
+ {
+ android::AutoMutex locker(mLock);
+ CAMHAL_UNUSED(locker);
+
+ mIsProcessed = true;
+ mCondition.signal();
}
LOG_FUNCTION_NAME_EXIT;
return false;
}
+void OMXCameraAdapter::OMXCallbackHandler::flush()
+{
+ LOG_FUNCTION_NAME;
+
+ AutoMutex locker(mLock);
+ CAMHAL_UNUSED(locker);
+
+ if ( mIsProcessed )
+ return;
+
+ mCondition.wait(mLock);
+}
+
OMX_OTHER_EXTRADATATYPE *OMXCameraAdapter::getExtradata(OMX_OTHER_EXTRADATATYPE *extraData, OMX_EXTRADATATYPE type)
{
if ( NULL != extraData )
diff --git a/camera/inc/OMXCameraAdapter/OMXCameraAdapter.h b/camera/inc/OMXCameraAdapter/OMXCameraAdapter.h
index de22217..fc676b0 100644
--- a/camera/inc/OMXCameraAdapter/OMXCameraAdapter.h
+++ b/camera/inc/OMXCameraAdapter/OMXCameraAdapter.h
@@ -727,7 +727,10 @@ public:
class OMXCallbackHandler : public Thread {
public:
OMXCallbackHandler(OMXCameraAdapter* ca)
- : Thread(false), mCameraAdapter(ca) { }
+ : Thread(false), mCameraAdapter(ca)
+ {
+ mIsProcessed = true;
+ }
virtual bool threadLoop() {
bool ret;
@@ -746,6 +749,8 @@ public:
mCommandMsgQ.clear();
}
+ void flush();
+
enum {
COMMAND_EXIT = -1,
CAMERA_FILL_BUFFER_DONE,
@@ -756,6 +761,8 @@ public:
TIUTILS::MessageQueue mCommandMsgQ;
OMXCameraAdapter* mCameraAdapter;
Mutex mLock;
+ Condition mCondition;
+ bool mIsProcessed;
};
sp<OMXCallbackHandler> mOMXCallbackHandler;