BST_VOID BST_CTaskSchdler::ScheduleTask( BST_CORE_CPTask *pC_PTask ) { BST_SRV_CTaskMng *pcTaskManager; BST_TASK_STATE_ENUM_UINT8 enTaskState; pcTaskManager = BST_SRV_CTaskMng::GetInstance (); BST_ASSERT_NULL( pcTaskManager ); /* * 入口检查 */ if ( BST_NULL_PTR == pC_PTask ) { BST_RLS_LOG( "BST_CTaskSchdler::ScheduleTask pC_PTask=NULL" ); return; } /* * 如果上次执行的事件尚未完成,本次不运行 */ if ( BST_TRUE == pC_PTask->IsBusy () ) { BST_RLS_LOG( "BST_CTaskSchdler::ScheduleTask pC_PTask Is Busy" ); return; } /* * 如果系统TICK可以被任务周期整除,说明到了整数倍对齐时间 */ if ( 0 != m_ulSystemTick%pC_PTask->m_ulCycle ) { return; } enTaskState = pC_PTask->GetState (); BST_DBG_LOG3( "BST_CTaskSchdler::ScheduleTask enTaskState:%d,m_ulTaskBlockState:%d,m_ulBlockInfo:%d", enTaskState, pC_PTask->m_ulTaskBlockState,m_ulBlockInfo); switch ( enTaskState ) { /* * 如果任务停止,只设置suspendCounter为0,不做任何事情 */ case BST_TASK_STATE_STOPED: pC_PTask->m_ulSuspCounter = 0; break; /* * 如果任务挂起超过最大限度,则立即删除之 */ case BST_TASK_STATE_SUSPEND: pC_PTask->m_ulSuspCounter ++; if ( pC_PTask->m_ulSuspCounter >= BST_TASK_MAX_SYSPEND ) { pcTaskManager->Remove ( pC_PTask->m_usProcId, pC_PTask->m_usTaskId ); } break; /* * 如果认为处于运行态,则调度执行 */ case BST_TASK_STATE_START: switch(pC_PTask->m_ulTaskBlockState) { /*当前处于normal状态,在周期的整数倍时,如果当前为unblock状态,则执行任务 否则设置当前task的任务状态为expired */ case BST_TASK_BLOCK_STATE_NORMAL: if( BST_AS_UNBLOCKED == m_ulBlockInfo ) { Execute( pC_PTask ); } else { pC_PTask->m_ulTaskBlockState = BST_TASK_BLOCK_STATE_EXPIRED; m_bTaskMissExec = BST_TRUE; } break; /*当前处于EXPIRED状态,如果恢复unblock状态,直接调度,该分支为异常保护分支*/ case BST_TASK_BLOCK_STATE_EXPIRED: if( BST_AS_UNBLOCKED == m_ulBlockInfo ) { Execute( pC_PTask ); pC_PTask->m_ulTaskBlockState = BST_TASK_BLOCK_STATE_NORMAL; } break; default: break; } break; default: break; } if(BST_TASK_BLOCK_STATE_IGNORE == pC_PTask->m_ulTaskBlockState) { pC_PTask->m_ulTaskBlockState = BST_TASK_BLOCK_STATE_NORMAL; } }
BST_ERR_ENUM_UINT8 BST_SRV_CHNL_Send_Runing( BST_SRV_CHNL_LINK_STRU *pstChnlLink, BST_SRV_CHNL_HEAD_STRU *pstPktItem ) { BST_SRV_CHNL_SENT_STRU *pSentItem; BST_SRV_CHNL_HEAD_STRU *pstUnsendItem; BST_SRV_CHNL_LINK_STRU *pstLinkItem2; BST_IP_ERR_T enIpErr; BST_DSPP_CAppUlVc *pstDsppUl; BST_UINT32 ulSpinlockCnt; BST_UINT16 usFlags; BST_ASSERT_NULL_RTN( pstChnlLink, BST_ERR_INVALID_PTR ); BST_ASSERT_NULL_RTN( pstPktItem, BST_ERR_INVALID_PTR ); enIpErr = BST_IP_ERR_OK; if( BST_SRV_ChnlIsTail(pstPktItem) ) { usFlags = BST_IP_SEND_FLAG_VOID; } else { usFlags = BST_IP_SEND_FLAG_MORE; } if( BST_IP_SKT_PROP_NONE != pstPktItem->ucPropType ) { BST_SRV_CHNL_Set_LinkProp( pstChnlLink, pstPktItem ); pstChnlLink->ulCurrentSeq = pstPktItem->stProp.ulSeqNum; } BST_DBG_LOG4("BST_SRV_CHNL_Send_Runing Length, ProcLevel, PackAddr, Flag", pstPktItem->ulUsed, pstPktItem->usProcLevel, pstPktItem->ucPktAddr, usFlags ); switch( pstPktItem->usProcLevel ) { case BST_DSPP_FLG_LVLTYPE_NORMAL: enIpErr = pstChnlLink->pcSocket->Write ( (const BST_UINT8 *)&pstPktItem->aucData[0], (BST_UINT16)pstPktItem->ulUsed, BST_IP_BSTT_DATA, usFlags ); break; case BST_DSPP_FLG_LVLTYPE_HS: enIpErr = pstChnlLink->pcSocket->Write ( (const BST_UINT8 *)&pstPktItem->aucData[0], (BST_UINT16)pstPktItem->ulUsed, BST_IP_HPRI_DATA, usFlags ); break; case BST_DSPP_FLG_LVLTYPE_LP: enIpErr = pstChnlLink->pcSocket->Write ( (const BST_UINT8 *)&pstPktItem->aucData[0], (BST_UINT16)pstPktItem->ulUsed, BST_IP_LPWR_DATA, usFlags ); break; default: return BST_ERR_PAR_UNKNOW; } if( BST_IP_ERR_OK == enIpErr ) { pSentItem = ( BST_SRV_CHNL_SENT_STRU *)BST_OS_MALLOC( BST_OS_SIZEOF( BST_SRV_CHNL_SENT_STRU ) ); if( BST_NULL_PTR == pSentItem ) { return BST_ERR_NO_MEMORY; } pstChnlLink->ulCurrentSeq += pstPktItem->ulUsed; pSentItem->pNext = BST_NULL_PTR; if ( BST_DSPP_FLG_LVLTYPE_HS == pstPktItem->usProcLevel ) { ulSpinlockCnt = BST_OS_SpinLock( &g_HighPriCntSpinLock ); g_ulHighPriCnt++; BST_OS_SpinUnLock( &g_HighPriCntSpinLock , ulSpinlockCnt ); } pSentItem->usProcLevel = pstPktItem->usProcLevel; pSentItem->ulAckNo = pstChnlLink->ulCurrentSeq; BST_SRV_Q_PushToTail( (BST_SRV_CHNL_Q **)&pstChnlLink->pSentList, (BST_SRV_CHNL_Q *)pSentItem ); BST_DBG_LOG3("tiger BST_SRV_FreeIpBlock1 g_ulHighPriCnt++, sent",pstPktItem, g_ulHighPriCnt, pstPktItem->ulUsed); BST_SRV_FreeIpBlock( pstPktItem ); } else if( BST_IP_ERR_MEM == enIpErr ) { /*申请空间存储未发送的数据,避免在处理完成时将数据释放*/ pstUnsendItem = BST_SRV_AlocIpBlock(); if ( BST_NULL_PTR == pstUnsendItem ) { return BST_ERR_NO_MEMORY; } BST_OS_MEMCPY( pstUnsendItem, pstPktItem, BST_OS_SIZEOF(BST_SRV_CHNL_HEAD_STRU)); BST_SRV_CHNL_Send_Suspend( pstChnlLink, pstUnsendItem ); pstChnlLink->enState = BST_SRV_CHNL_STATE_SUSPEND; return BST_ERR_NO_MEMORY; } else { pstDsppUl = BST_DSPP_CAppUlVc::GetInstance(); if( pstChnlLink->ulAddrType == BST_DSPP_FLG_ADDTYPE_INET ) { pstDsppUl->Report( BST_DSPP_FLG_CMD_CLOSE, pstChnlLink->stLink.ulMainLinkId, pstChnlLink->stLink.ulAuxLinkId ); BST_SRV_CHNL_ReportTrafficFlow( pstChnlLink ); } else { pstDsppUl->Report( BST_DSPP_FLG_CMD_CLOSE, pstChnlLink->stDspp.usProcId, pstChnlLink->stDspp.usTaskId ); } BST_SRV_CHNL_Close( pstChnlLink ); delete pstChnlLink->pcSocket; BST_SRV_Q_RmvItem( (BST_SRV_CHNL_Q **)&g_lstChnlMng, (BST_SRV_CHNL_Q *)pstChnlLink, (BST_SRV_CHNL_Q **)&pstLinkItem2 ); BST_OS_FREE(pstChnlLink); return BST_ERR_SOCKET_CLSD; } return BST_NO_ERROR_MSG; }