diff options
author | Sunita Nadampalli <sunitan@ti.com> | 2016-05-25 15:51:16 -0500 |
---|---|---|
committer | Sunita Nadampalli <sunitan@ti.com> | 2016-06-07 14:40:49 -0500 |
commit | 2bb146813af36109b2a41a633f6513cad232b1ad (patch) | |
tree | bfd9c420a974b51d66b2ea8c5ff551682434a25c | |
parent | 0553d7691c9f7c3990005d6fbe2688f1b19ee7ad (diff) | |
download | dra7xx-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.c | 59 | ||||
-rwxr-xr-x | omx/osal/src/osal_events.c | 2 |
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; } |