From: Sivaraj R Date: Sun, 21 Oct 2018 17:11:14 +0000 (+0530) Subject: Bug Fix: PDK-3358 X-Git-Tag: DEV.FVID2.01.00.00.01~2 X-Git-Url: https://git.ti.com/gitweb?p=keystone-rtos%2Ffvid2.git;a=commitdiff_plain;h=252ca509a54ea7ca79a6623d9fc34b8b8773aa18 Bug Fix: PDK-3358 - Fix print from multiple threads - Added sempahore lock to project the buffer including the print function call Signed-off-by: Sivaraj R --- diff --git a/src/fvid2_drvMgr.c b/src/fvid2_drvMgr.c index c709238..17d9fb2 100755 --- a/src/fvid2_drvMgr.c +++ b/src/fvid2_drvMgr.c @@ -141,6 +141,8 @@ typedef struct /**< FDM Channel objects. */ SemaphoreP_Handle lockSem; /**< Semaphore to protect function calls and other memory allocation. */ + SemaphoreP_Handle printSem; + /**< Semaphore to protect print buffer. */ } Fdm_Object; #if defined (FVID2_CFG_TRACE_ENABLE) @@ -508,6 +510,15 @@ int32_t Fvid2_init(const Fvid2_InitPrms *initPrms) GT_0trace(Fvid2Trace, GT_ERR, "FVID2 semaphore create failed!!\r\n"); retVal = FVID2_EALLOC; } + SemaphoreP_Params_init(¶ms); + params.mode = SemaphoreP_Mode_BINARY; + initValue = 1; + gFdmObj.printSem = SemaphoreP_create(initValue, ¶ms); + if (NULL == gFdmObj.printSem) + { + GT_0trace(Fvid2Trace, GT_ERR, "FVID2 semaphore create failed!!\r\n"); + retVal = FVID2_EALLOC; + } /* Free-up memory if error occurs */ if (FVID2_SOK != retVal) @@ -538,6 +549,11 @@ int32_t Fvid2_deInit(void *args) SemaphoreP_delete(gFdmObj.lockSem); gFdmObj.lockSem = NULL; } + if (NULL != gFdmObj.printSem) + { + SemaphoreP_delete(gFdmObj.printSem); + gFdmObj.printSem = NULL; + } return (retVal); } @@ -1450,10 +1466,9 @@ void Fvid2_printf(const char *format, ...) { #if defined (FVID2_CFG_TRACE_ENABLE) va_list vaArgPtr; - uintptr_t cookie; char *buf = NULL; - cookie = HwiP_disable(); + SemaphoreP_pend(gFdmObj.printSem, SemaphoreP_WAIT_FOREVER); buf = &gRemoteDebug_serverObj.printBuf[0]; va_start(vaArgPtr, format); @@ -1461,12 +1476,12 @@ void Fvid2_printf(const char *format, ...) (const char *) format, vaArgPtr); va_end(vaArgPtr); - HwiP_restore(cookie); - if(gFdmInitPrms.printFxn != NULL) { gFdmInitPrms.printFxn(buf); } + + SemaphoreP_post(gFdmObj.printSem); #endif return; }