WILC_Uint32 FIFO_InitBuffer(tHANDLE * hBuffer,WILC_Uint32 u32BufferLength) { WILC_Uint32 u32Error = 0; tstrFifoHandler * pstrFifoHandler = WILC_MALLOC(sizeof(tstrFifoHandler)); if(pstrFifoHandler) { WILC_memset(pstrFifoHandler,0,sizeof(tstrFifoHandler)); pstrFifoHandler->pu8Buffer = WILC_MALLOC(u32BufferLength); if(pstrFifoHandler->pu8Buffer) { tstrWILC_SemaphoreAttrs strSemBufferAttrs; pstrFifoHandler->u32BufferLength = u32BufferLength; WILC_memset(pstrFifoHandler->pu8Buffer,0,u32BufferLength); //create semaphore WILC_SemaphoreFillDefault(&strSemBufferAttrs); strSemBufferAttrs.u32InitCount = 1; WILC_SemaphoreCreate(&pstrFifoHandler->SemBuffer, &strSemBufferAttrs); *hBuffer = pstrFifoHandler; } else { *hBuffer = NULL; u32Error = 1; } } else { u32Error = 1; } return u32Error; }
/*! * @author syounan * @date 1 Sep 2010 * @note copied from FLO glue implementatuion * @version 1.0 */ WILC_ErrNo WILC_MsgQueueSend(WILC_MsgQueueHandle *pHandle, const void *pvSendBuffer, WILC_Uint32 u32SendBufferSize, tstrWILC_MsgQueueAttrs *pstrAttrs) { WILC_ErrNo s32RetStatus = WILC_SUCCESS; unsigned long flags; Message *pstrMessage = NULL; if ((pHandle == NULL) || (u32SendBufferSize == 0) || (pvSendBuffer == NULL)) { WILC_ERRORREPORT(s32RetStatus, WILC_INVALID_ARGUMENT); } if (pHandle->bExiting == WILC_TRUE) { WILC_ERRORREPORT(s32RetStatus, WILC_FAIL); } spin_lock_irqsave(&pHandle->strCriticalSection, flags); /* construct a new message */ pstrMessage = WILC_NEW(Message, 1); WILC_NULLCHECK(s32RetStatus, pstrMessage); pstrMessage->u32Length = u32SendBufferSize; pstrMessage->pstrNext = NULL; pstrMessage->pvBuffer = WILC_MALLOC(u32SendBufferSize); WILC_NULLCHECK(s32RetStatus, pstrMessage->pvBuffer); WILC_memcpy(pstrMessage->pvBuffer, pvSendBuffer, u32SendBufferSize); /* add it to the message queue */ if (pHandle->pstrMessageList == NULL) { pHandle->pstrMessageList = pstrMessage; } else { Message *pstrTailMsg = pHandle->pstrMessageList; while (pstrTailMsg->pstrNext != NULL) { pstrTailMsg = pstrTailMsg->pstrNext; } pstrTailMsg->pstrNext = pstrMessage; } spin_unlock_irqrestore(&pHandle->strCriticalSection, flags); WILC_SemaphoreRelease(&pHandle->hSem, WILC_NULL); WILC_CATCH(s32RetStatus) { /* error occured, free any allocations */ if (pstrMessage != NULL) { if (pstrMessage->pvBuffer != NULL) { WILC_FREE(pstrMessage->pvBuffer); } WILC_FREE(pstrMessage); } } return s32RetStatus; }
u32 FIFO_InitBuffer(tHANDLE *hBuffer, u32 u32BufferLength) { u32 u32Error = 0; tstrFifoHandler *pstrFifoHandler = WILC_MALLOC (sizeof (tstrFifoHandler)); if (pstrFifoHandler) { WILC_memset (pstrFifoHandler, 0, sizeof (tstrFifoHandler)); pstrFifoHandler->pu8Buffer = WILC_MALLOC (u32BufferLength); if (pstrFifoHandler->pu8Buffer) { pstrFifoHandler->u32BufferLength = u32BufferLength; WILC_memset (pstrFifoHandler->pu8Buffer, 0, u32BufferLength); /* create semaphore */ sema_init(&pstrFifoHandler->SemBuffer, 1); *hBuffer = pstrFifoHandler; } else { *hBuffer = NULL; u32Error = 1; } } else { u32Error = 1; } return u32Error; }