/*lint -e438*/ BST_VOID BST_CTaskSchdler::Detach ( BST_CORE_CPTask *pC_PTask ) { BST_CORE_PTASK_NODE_STRU *pstPtaskNode; if ( !BST_OS_IsTimerValid (m_ulTimerId) ) { BST_RLS_LOG1( "BST_CTaskSchdler::Detach m_ulTimerId=%u is invalid", m_ulTimerId ); return; } if ( BST_NULL_PTR == pC_PTask ) { BST_RLS_LOG( "BST_CTaskSchdler::Detach pC_PTask=NULL" ); return; } /* * 遍历列表,找到pctask相符的任务,从链表删除,释放资源 */ for ( pstPtaskNode = (BST_CORE_PTASK_NODE_STRU *)lstFirst( &g_stPTaskList ); pstPtaskNode!= BST_NULL_PTR; pstPtaskNode = (BST_CORE_PTASK_NODE_STRU *)lstNext((NODE *)pstPtaskNode) ) { if( pstPtaskNode->pcTask != pC_PTask ) { continue; } lstDelete( &g_stPTaskList, (NODE *)pstPtaskNode ); BST_OS_FREE( pstPtaskNode ); break; } /* * 注销后,如果认为列表为空,则直接关闭定时器,不进行任何调度 */ if ( 0 == lstCount( &g_stPTaskList ) ) { BST_DBG_LOG( "BST_CTaskSchdler::Detach Stop Scheduler Timer" ); BST_OS_TimerStop ( m_ulTimerId ); } }
BST_VOID BST_CTaskSchdler::UtranBlockInfoChgProc( BST_UINT32 *pulBlockInfo ) { BST_INT32 lTaskCnt; BST_UINT32 ulNextTickRemainTime; BST_UINT32 ulBlockInfo; BST_CORE_PTASK_NODE_STRU *pstPtaskNode; BST_CORE_PTASK_NODE_STRU *pstPtaskNodeNext; BST_BOOL bTimerStop; if( BST_NULL_PTR == pulBlockInfo) { return; } ulBlockInfo = (BST_UINT32 )*pulBlockInfo; BST_DBG_LOG2( "BST_CTaskSchdler::UtranBlockInfoChgProc blockold=u%, blockNew=u%", m_ulBlockInfo,ulBlockInfo); if ( m_ulBlockInfo == ulBlockInfo ) { return; } m_ulBlockInfo = ulBlockInfo; if ( BST_AS_UNBLOCKED == m_ulBlockInfo ) { BST_DBG_LOG1( "BST_CTaskSchdler::UtranBlockInfoChgProc :%d", m_bTaskMissExec ); if(BST_FALSE == m_bTaskMissExec) { return; } lTaskCnt = lstCount( &g_stPTaskList ); BST_DBG_LOG1( "BST_CTaskSchdler::UtranBlockInfoChgProc TaskNum=u%", lTaskCnt ); if ( 0 == lTaskCnt ) { return; } ulNextTickRemainTime = 0; bTimerStop = BST_OS_TimerIsStop( m_ulTimerId ); if ( BST_FALSE == bTimerStop ) { ulNextTickRemainTime = BST_OS_TimeGetRemain( m_ulTimerId ); BST_OS_TimerStop ( m_ulTimerId ); } BST_DBG_LOG2( "BST_CTaskSchdler::UtranBlockInfoChgProc stop:%d,timerremain=u%", bTimerStop,ulNextTickRemainTime ); /* * 遍历任务列表,获取任务并进行相应调度 */ for ( pstPtaskNode = ( BST_CORE_PTASK_NODE_STRU *)lstFirst( &g_stPTaskList ); pstPtaskNode!= BST_NULL_PTR; pstPtaskNode = pstPtaskNodeNext ) { pstPtaskNodeNext = ( BST_CORE_PTASK_NODE_STRU *) lstNext((NODE *)pstPtaskNode); if ( BST_NULL_PTR == pstPtaskNode->pcTask ) { continue; } /* * 如果任务不为空,则根据状态进行调度 */ TrigScheduleTask ( pstPtaskNode->pcTask); } if((0 == ulNextTickRemainTime) || (ulNextTickRemainTime > BST_TASK_SYS_BASE_TIMELEN)) { ulNextTickRemainTime = BST_TASK_SYS_BASE_TIMELEN; } BST_OS_TimerStart ( m_ulTimerId, ulNextTickRemainTime ); } }
BST_ERR_ENUM_UINT8 BST_SRV_CHNL_Acked ( BST_SRV_CHNL_LINK_STRU *pstLinkItem, const BST_UINT32 ulMinNumber, const BST_UINT32 ulMaxNumber ) { BST_SRV_CHNL_SENT_STRU *pSentItem; BST_SRV_CHNL_SENT_STRU *pSentItem2; BST_SRV_CHNL_HEAD_STRU *pstPktItem; BST_SRV_CHNL_HEAD_STRU *pstPktItem2; BST_UINT32 ulSpinlockCnt; BST_UINT32 ulOrigCounter; BST_DRV_STRU *pNetDrvHandle; BST_ERR_ENUM_UINT8 enRtnVal; BST_ASSERT_NULL_RTN( pstLinkItem, BST_ERR_INVALID_PTR ); BST_ASSERT_NORM_RTN( ulMaxNumber < ulMinNumber, BST_ERR_ILLEGAL_PARAM ); BST_DBG_LOG2( "BST_SRV_CHNL_Acked ulMinNumber, ulMaxNumber", ulMinNumber, ulMaxNumber ); /*查找已发送的数据包的*/ pSentItem = BST_SRV_Q_PeekHead(pstLinkItem->pSentList); ulOrigCounter = g_ulHighPriCnt; pSentItem2 = BST_NULL_PTR; pstPktItem2 = BST_NULL_PTR; while( pSentItem != BST_NULL_PTR ) { if ( ( pSentItem->ulAckNo > ulMinNumber ) &&( pSentItem->ulAckNo <=ulMaxNumber ) ) { if( BST_DSPP_FLG_LVLTYPE_HS == pSentItem->usProcLevel ) { ulSpinlockCnt = BST_OS_SpinLock( &g_HighPriCntSpinLock ); if ( g_ulHighPriCnt > 0 ) { g_ulHighPriCnt--; } BST_OS_SpinUnLock( &g_HighPriCntSpinLock , ulSpinlockCnt ); } BST_DBG_LOG1("BST_SRV_CHNL_Acked,g_ulHighPriCnt--",g_ulHighPriCnt); BST_SRV_Q_RmvItem( (BST_SRV_CHNL_Q **)&pstLinkItem->pSentList, (BST_SRV_CHNL_Q *)pSentItem, (BST_SRV_CHNL_Q **)&pSentItem2 ); BST_OS_FREE( pSentItem ); } else { pSentItem2 = pSentItem->pNext; } pSentItem = pSentItem2; } pstPktItem = BST_SRV_Q_PeekHead(pstLinkItem->pUnsendList); while ( pstPktItem != BST_NULL_PTR ) { if( BST_IP_SKT_PROP_NONE != pstPktItem->ucPropType ) { if( ( ( pstPktItem->stProp.ulSeqNum + pstPktItem->ulUsed ) > ulMinNumber ) &&( ( pstPktItem->stProp.ulSeqNum + pstPktItem->ulUsed ) <=ulMaxNumber ) ) { BST_SRV_Q_RmvItem( (BST_SRV_CHNL_Q **)&pstLinkItem->pUnsendList, (BST_SRV_CHNL_Q *)pstPktItem, (BST_SRV_CHNL_Q **)&pstPktItem2 ); BST_SRV_FreeIpBlock( pstPktItem ); } else { pstPktItem2 = pstPktItem->pNext; } } else { pstPktItem2 = pstPktItem->pNext; } pstPktItem = pstPktItem2; } enRtnVal = BST_NO_ERROR_MSG; if( BST_NULL_PTR != pstLinkItem->pUnsendList ) { BST_OS_TimerStop( pstLinkItem->ulTimerId ); BST_DBG_LOG( "BST_SRV_CHNL_Acked, Proc Unsent List" ); enRtnVal = BST_SRV_CHNL_ProcInCB( pstLinkItem ); } /** * 刚刚有值,现在无值,那么说明全部高优先数据发送完成 */ if( ( 0 != ulOrigCounter ) && ( 0 == g_ulHighPriCnt ) ) { pNetDrvHandle = BST_DRV_NetGetDvcHandle(); enRtnVal = 0; pNetDrvHandle->pfIoCtrl( BST_DRV_CMD_HPR_DATA_FINISH, (BST_VOID *)&enRtnVal ); BST_DBG_LOG( "BST_SRV_CHNL_Acked, BST_DRV_CMD_HPR_DATA_FINISH" ); } return enRtnVal; }