BST_OS_SEM_STRU *BST_OS_CreateSem( BST_VOID *pvArg, BST_UINT32 ulInitCnt ) { BST_OS_SEM_STRU *pstOsSem; BST_OS_LOCKCNT_T tThreadLockCnt; pstOsSem = (BST_OS_SEM_STRU *)BST_OS_MALLOC( BST_OS_SIZEOF( BST_OS_SEM_STRU ) ); if( BST_NULL_PTR == pstOsSem ) { return BST_NULL_PTR; } tThreadLockCnt = BST_OS_ThreadLock(); pstOsSem->pvArg = BST_OS_GetCurrentThreadId(); pstOsSem->stHandle = BST_OS_PalCreateSem( ulInitCnt ); if ( BST_OS_SYS_IsSemValid(pstOsSem->stHandle) ) { BST_OS_FREE( pstOsSem ); BST_OS_ThreadUnLock( tThreadLockCnt ); /*lint -e438*/ return BST_NULL_PTR; /*lint +e438*/ } #ifdef BST_OS_SIGNAL_COUNTER pstOsSem->ulCounter = ulInitCnt; if ( 0U != pstOsSem->ulCounter ) { BST_OS_PalSendSem( pstOsSem->stHandle, pstOsSem->pvArg ); } #endif BST_OS_ThreadUnLock( tThreadLockCnt ); return pstOsSem; }
BST_UINT32 BST_OS_RecvSem( BST_OS_SEM_STRU *pstSemHandle, BST_UINT32 ulTimeOut ) { BST_UINT32 ulStartTime; BST_UINT32 ulEndTime; BST_ERR_ENUM_UINT8 ucRtnVal; if( BST_NULL_PTR == pstSemHandle ) { return BST_OS_SYS_TIMEOUT; } ulStartTime = BST_OS_TimerNowMs(); pstSemHandle->pvArg = BST_OS_GetCurrentThreadId(); #ifdef BST_OS_SIGNAL_COUNTER do { ucRtnVal = BST_OS_PalRecvSem( pstSemHandle->stHandle, ulTimeOut ); if ( BST_NO_ERROR_MSG != ucRtnVal ) { break; } }while( 0U == pstSemHandle->ulCounter ); #else ucRtnVal = BST_OS_PalRecvSem( pstSemHandle->stHandle, ulTimeOut ); #endif if( BST_NO_ERROR_MSG == ucRtnVal ) { ulEndTime = BST_OS_TimerNowMs(); #ifdef BST_OS_SIGNAL_COUNTER if( pstSemHandle->ulCounter > 0U ) { pstSemHandle->ulCounter--; } if( pstSemHandle->ulCounter > 0U ) { BST_OS_PalSendSem( pstSemHandle->stHandle, pstSemHandle->pvArg ); } #endif if( ulEndTime > ulStartTime ) { return( ulEndTime - ulStartTime ); } else { return 0U; } } else { return BST_OS_SYS_TIMEOUT; } }
BST_VOID BST_SRV_CHNL_ThreadEntry( BST_VOID *pvArg ) { BST_OS_MBX_T **pstMailBox; BST_OS_LOCKCNT_T tThreadLockCnt; BST_EVT_HEAD_STRU *pstEvent; BST_UINT32 ulRtnVal; if ( BST_NULL_PTR == pvArg ) { return; } /* * 线程参数初始化,包括邮箱,运行标识 */ tThreadLockCnt = BST_OS_ThreadLock (); pstMailBox = (BST_OS_MBX_T **)pvArg; *pstMailBox = BST_OS_CreateMbx ( BST_OS_GetCurrentThreadId(), BST_L_MBOX_SIZE ); if ( BST_NULL_PTR == *pstMailBox ) { BST_OS_ThreadUnLock ( tThreadLockCnt ); return; } BST_SetThreadInitFlag( BST_CHNL_CTRL_THREAD_FLAG ); g_lstChnlMng = BST_NULL_PTR; BST_OS_InitSpinLock( &g_HighPriCntSpinLock ); BST_OS_ThreadUnLock ( tThreadLockCnt ); /* * 进入线程主循环,等待邮件,邮件内容为即将执行的任务 */ for(;;) { ulRtnVal = BST_OS_RecvMail ( *pstMailBox, (BST_VOID **)&pstEvent, BST_OS_SYS_FOREVER ); BST_ASSERT_NORM( BST_OS_SYS_TIMEOUT == ulRtnVal ); BST_SRV_ProcChnlCtrEvent( pstEvent ); /*这里判断指针不为空再次释放,因此需要传递指针的指针*/ if( BST_NULL_PTR != pstEvent->pucData ) { BST_DBG_LOG1( "tiger BST_OS_FREE 8,", pstEvent->pucData ); BST_OS_FREE( pstEvent->pucData ); } BST_OS_FREE( pstEvent ); #if ( BST_VER_TYPE == BST_UT_VER ) break; #endif } }
BST_VOID BST_CTaskSchdler::AppThread ( BST_VOID* arg ) { BST_CORE_CPTask *pcTask; BST_OS_MBX_T **pstMailBox; BST_OS_LOCKCNT_T tThreadLockCnt; BST_UINT32 ulRtnVal; if ( BST_NULL_PTR == arg ) { return; } /* * 线程参数初始化,包括邮箱,运行标识 */ tThreadLockCnt = BST_OS_ThreadLock (); pstMailBox = (BST_OS_MBX_T **)arg; *pstMailBox = BST_OS_CreateMbx ( BST_OS_GetCurrentThreadId (), BST_MAX_APP_NUMBER ); BST_SetThreadInitFlag ( BST_APP_THREAD_FLAG << g_ucAppInitCnt ); g_ucAppInitCnt++; BST_OS_ThreadUnLock ( tThreadLockCnt ); /* * 进入线程主循环,等待邮件,邮件内容为即将执行的任务 */ for(;;) { ulRtnVal = BST_OS_RecvMail ( *pstMailBox, (BST_VOID **)&pcTask, BST_OS_SYS_FOREVER ); BST_ASSERT_NORM( BST_OS_SYS_TIMEOUT == ulRtnVal ); if ( BST_NULL_PTR == pcTask ) { continue; } if ( BST_FALSE == ChkTaskExist (pcTask) ) { continue; } if ( BST_TRUE == pcTask->IsBusy () ) { continue; } pcTask->PEntry (); } }
BST_VOID BST_SRV_CEvent::RcvThread( BST_VOID *pvArg ) { BST_OS_MBX_T **pstMailBox; BST_EVT_HEAD_STRU *pstEvtMsg; BST_AS_EVT_STRU *pstAsEvt; BST_ACOM_EVT_STRU *pstAcomEvt; BST_TIMER_EVT_STRU *pstTimerEvt; BST_NET_EVENT_STRU *pstNetEvt; BST_DSPP_CTrsDlVa *pcTrslayer; BST_SRV_CAsEvt *pcAsMng; BST_OS_TIMERID_T ulTimerId; BST_UINT32 ulRtnVal; BST_ASSERT_NULL( pvArg ); pstMailBox = (BST_OS_MBX_T **)pvArg; *pstMailBox = BST_OS_CreateMbx( BST_OS_GetCurrentThreadId(), BST_M_MBOX_SIZE ); BST_ASSERT_NULL( *pstMailBox ); BST_SetThreadInitFlag( BST_MAIN_THREAD_FLAG ); for (;;) { ulRtnVal = BST_OS_RecvMail( *pstMailBox, (BST_VOID **)&pstEvtMsg, BST_OS_SYS_FOREVER ); if( BST_OS_SYS_TIMEOUT == ulRtnVal ) { continue; } if( BST_NULL_PTR == pstEvtMsg ) { continue; } BST_DBG_LOG1( "BST_SRV_CEvent::RcvThread pstEvtMsg->enId=%d", pstEvtMsg->enId ); switch( pstEvtMsg->enId ) { case BST_SRV_ACOM_EVENT: pcTrslayer = BST_DSPP_CTrsDlVa::GetInstance(); if ( BST_NULL_PTR == pcTrslayer ) { break; } pstAcomEvt = (BST_ACOM_EVT_STRU *)pstEvtMsg; pcTrslayer->RxApi( pstAcomEvt->pucData, (BST_UINT16)pstAcomEvt->ulLength ); break; case BST_SRV_AS_EVENT: pcAsMng = BST_SRV_CAsEvt::GetInstance(); if ( BST_NULL_PTR == pcAsMng ) { break; } pstAsEvt = (BST_AS_EVT_STRU *)pstEvtMsg; pcAsMng->AsEventRcv( pstAsEvt->enAsEvent, pstAsEvt->ulLength,(BST_VOID *)pstAsEvt->pucData ); break; case BST_SRV_TIMER_EVENT: pstTimerEvt = (BST_TIMER_EVT_STRU *)pstEvtMsg; if( BST_OS_SIZEOF(ulTimerId) != pstTimerEvt->ulLength ) { break; } BST_OS_MEMCPY( &ulTimerId, pstTimerEvt->pucData, BST_OS_SIZEOF(ulTimerId) ); BST_OS_TimerDoCallBack( ulTimerId ); break; case BST_SRV_TCPIP_EVENT: pstNetEvt = (BST_NET_EVENT_STRU *)pstEvtMsg; if( BST_OS_SIZEOF(BST_IP_EVENT_STRU) != pstNetEvt->ulLength ) { break; } BST_IP_CallBackEntry ( ( BST_IP_EVENT_STRU * )pstNetEvt->pucData ); break; default: break; } if( BST_NULL_PTR != pstEvtMsg->pucData ) { BST_OS_FREE( pstEvtMsg->pucData ); } BST_OS_FREE( pstEvtMsg ); #if ( BST_VER_TYPE == BST_UT_VER ) break; #endif } }