summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSunita Nadampalli <sunitan@ti.com>2016-05-25 15:51:16 -0500
committerSunita Nadampalli <sunitan@ti.com>2016-06-07 14:40:49 -0500
commit2bb146813af36109b2a41a633f6513cad232b1ad (patch)
treebfd9c420a974b51d66b2ea8c5ff551682434a25c
parent0553d7691c9f7c3990005d6fbe2688f1b19ee7ad (diff)
downloaddra7xx-2bb146813af36109b2a41a633f6513cad232b1ad.tar.gz
OMX: Fix Error handling logic to avoid deadlock with stagefright
Change-Id: I683fd9d327713852d5efc114bb6d0a97742f8410 Signed-off-by: Sunita Nadampalli <sunitan@ti.com>
-rw-r--r--omx/base/omx_base_comp/src/omx_base_internal.c59
-rwxr-xr-xomx/osal/src/osal_events.c2
2 files changed, 33 insertions, 28 deletions
diff --git a/omx/base/omx_base_comp/src/omx_base_internal.c b/omx/base/omx_base_comp/src/omx_base_internal.c
index a2e1ac4..85c953f 100644
--- a/omx/base/omx_base_comp/src/omx_base_internal.c
+++ b/omx/base/omx_base_comp/src/omx_base_internal.c
@@ -26,6 +26,7 @@
#define OMXBase_TASKDEL_TRIES 1000
#define OMXBase_TASKDEL_SLEEP 2
+#define BUFFER_ALLOC_FREE_TIMEOUT 500 //500msec
#define OMX_BASE_HANDLE_IDLE_TO_LOADED_TRANSITION() do { \
for( i=0; i < pBaseComp->nNumPorts; i++ ) \
@@ -762,7 +763,13 @@ OMX_ERRORTYPE OMXBase_EventNotifyToClient(OMX_HANDLETYPE hComponent,
(BUF_ALLOC_EVENT | BUF_FREE_EVENT |
BUF_FAIL_EVENT),
OSAL_EVENT_OR_CONSUME, &retEvents,
- OSAL_SUSPEND);
+ BUFFER_ALLOC_FREE_TIMEOUT);
+
+ if (tStatus == OSAL_ErrTimeOut) {
+ tStatus = OSAL_ErrNone;
+ retEvents = BUF_FAIL_EVENT;
+ }
+
OMX_CHECK(tStatus == OSAL_ErrNone, OMX_ErrorUndefined);
if( retEvents & BUF_FAIL_EVENT ) {
/*Fail event so free up all DIO resources and move
@@ -825,7 +832,12 @@ OMX_ERRORTYPE OMXBase_EventNotifyToClient(OMX_HANDLETYPE hComponent,
tStatus = OSAL_RetrieveEvent(pPort->pBufAllocFreeEvent,
(BUF_ALLOC_EVENT | BUF_FAIL_EVENT),
OSAL_EVENT_OR_CONSUME, &retEvents,
- OSAL_SUSPEND);
+ BUFFER_ALLOC_FREE_TIMEOUT);
+ if (tStatus == OSAL_ErrTimeOut) {
+ tStatus = OSAL_ErrNone;
+ retEvents = BUF_FAIL_EVENT;
+ }
+
OMX_CHECK(tStatus == OSAL_ErrNone, OMX_ErrorUndefined);
if( retEvents & BUF_FAIL_EVENT ) {
/*Fail event so free up all DIO resources and move
@@ -861,11 +873,10 @@ OMX_ERRORTYPE OMXBase_EventNotifyToClient(OMX_HANDLETYPE hComponent,
tStatus = OSAL_RetrieveEvent(pPort->pBufAllocFreeEvent,
(BUF_ALLOC_EVENT | BUF_FAIL_EVENT),
OSAL_EVENT_OR_CONSUME, &retEvents,
- 3 * 1000); /* wait for 3sec */
-
- if( tStatus == OSAL_ErrTimeOut ) {
- pPort->bIsInTransition = OMX_FALSE;
- pPort->sPortDef.bEnabled = OMX_FALSE;
+ BUFFER_ALLOC_FREE_TIMEOUT);
+ if (tStatus == OSAL_ErrTimeOut) {
+ tStatus = OSAL_ErrNone;
+ retEvents = BUF_FAIL_EVENT;
}
OMX_CHECK(tStatus == OSAL_ErrNone,
@@ -907,7 +918,13 @@ OMX_ERRORTYPE OMXBase_EventNotifyToClient(OMX_HANDLETYPE hComponent,
tStatus = OSAL_RetrieveEvent(pPort->pBufAllocFreeEvent,
(BUF_FREE_EVENT | BUF_FAIL_EVENT),
OSAL_EVENT_OR_CONSUME, &retEvents,
- OSAL_SUSPEND);
+ BUFFER_ALLOC_FREE_TIMEOUT);
+
+ if (tStatus == OSAL_ErrTimeOut) {
+ tStatus = OSAL_ErrNone;
+ retEvents = BUF_FAIL_EVENT;
+ }
+
OMX_CHECK(tStatus == OSAL_ErrNone, OMX_ErrorUndefined);
if( retEvents & BUF_FAIL_EVENT ) {
/*Fail event so free up all DIO resources and move
@@ -940,7 +957,13 @@ OMX_ERRORTYPE OMXBase_EventNotifyToClient(OMX_HANDLETYPE hComponent,
tStatus = OSAL_RetrieveEvent(pPort->pBufAllocFreeEvent,
(BUF_FREE_EVENT | BUF_FAIL_EVENT),
OSAL_EVENT_OR_CONSUME, &retEvents,
- OSAL_SUSPEND);
+ BUFFER_ALLOC_FREE_TIMEOUT);
+
+ if (tStatus == OSAL_ErrTimeOut) {
+ tStatus = OSAL_ErrNone;
+ retEvents = BUF_FAIL_EVENT;
+ }
+
OMX_CHECK(tStatus == OSAL_ErrNone, OMX_ErrorUndefined);
if( retEvents & BUF_FAIL_EVENT ) {
/*Fail event so free up all DIO resources and move
@@ -1458,12 +1481,6 @@ void OMXBase_HandleFailEvent(OMX_HANDLETYPE hComponent, OMX_COMMANDTYPE eCmd,
/*If DIO for any port is open close those*/
for( i = 0; i < pBaseComp->nNumPorts; i++ ) {
pPort = pBaseComp->pPorts[i];
- retval = OSAL_RetrieveEvent(pPort->pBufAllocFreeEvent,
- BUF_FREE_EVENT, OSAL_EVENT_OR_CONSUME, &retEvents,
- 500);
- if( retval == OSAL_ErrTimeOut ) {
- OSAL_ErrorTrace("Event retrieve timed out on BUF_FREE_EVENT within function:%s", __FUNCTION__);
- }
if( pPort != NULL ) {
if( pPort->hDIO != NULL ) {
OMXBase_DIO_Close(hComponent,
@@ -1507,12 +1524,6 @@ void OMXBase_HandleFailEvent(OMX_HANDLETYPE hComponent, OMX_COMMANDTYPE eCmd,
if( nPortIndex == OMX_ALL ) {
for( i = 0; i < pBaseComp->nNumPorts; i++ ) {
pPort = pBaseComp->pPorts[i];
- retval = OSAL_RetrieveEvent(pPort->pBufAllocFreeEvent,
- BUF_FREE_EVENT, OSAL_EVENT_OR_CONSUME, &retEvents,
- 500);
- if( retval == OSAL_ErrTimeOut ) {
- OSAL_ErrorTrace("Event retrieve timed out on BUF_FREE_EVENT within function:%s", __FUNCTION__);
- }
if( pPort != NULL ) {
if( pPort->hDIO != NULL ) {
OMXBase_DIO_Close(hComponent, (i + pBaseComp->nMinStartPortIndex));
@@ -1523,12 +1534,6 @@ void OMXBase_HandleFailEvent(OMX_HANDLETYPE hComponent, OMX_COMMANDTYPE eCmd,
}
} else {
pPort = pBaseComp->pPorts[nPortIndex - pBaseComp->nMinStartPortIndex];
- retval = OSAL_RetrieveEvent(pPort->pBufAllocFreeEvent,
- BUF_FREE_EVENT, OSAL_EVENT_OR_CONSUME, &retEvents,
- 500);
- if( retval == OSAL_ErrTimeOut ) {
- OSAL_ErrorTrace("Event retrieve timed out on BUF_FREE_EVENT within function:%s", __FUNCTION__);
- }
if( pPort != NULL ) {
if( pPort->hDIO != NULL ) {
OMXBase_DIO_Close(hComponent, nPortIndex);
diff --git a/omx/osal/src/osal_events.c b/omx/osal/src/osal_events.c
index 6b03cb2..c8486fc 100755
--- a/omx/osal/src/osal_events.c
+++ b/omx/osal/src/osal_events.c
@@ -236,7 +236,7 @@ OSAL_ERROR OSAL_RetrieveEvent(void *pEvents, uint32_t uRequestedEvents,
/*Timedout or error and returned without being signalled */
if (SUCCESS != status) {
if (ETIMEDOUT == status)
- bRet = OSAL_ErrNone;
+ bRet = OSAL_ErrTimeOut;
*pRetrievedEvents = 0;
break;
}