Bug Fix: PDK-3358
authorSivaraj R <sivaraj@ti.com>
Sun, 21 Oct 2018 17:11:14 +0000 (22:41 +0530)
committerSivaraj R <sivaraj@ti.com>
Mon, 22 Oct 2018 07:47:29 +0000 (13:17 +0530)
- Fix print from multiple threads
- Added sempahore lock to project the buffer
including the print function call

Signed-off-by: Sivaraj R <sivaraj@ti.com>
src/fvid2_drvMgr.c

index c709238313b250bc43614af4880a5b9382e7e9d3..17d9fb2245aa0f7537cbdb3c6ed35e1cb5835cca 100755 (executable)
@@ -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(&params);
+    params.mode = SemaphoreP_Mode_BINARY;
+    initValue       = 1;
+    gFdmObj.printSem = SemaphoreP_create(initValue, &params);
+    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;
 }