📄 portmanager.cpp
字号:
#include "PortManager.h"#include <stdio.h>#include <string.h>#include "MyAssert.h"#include "XMLConfig2.h"#include "LogInterface.h"PortManager *PortManager::m_inst=NULL;static Bool bDebug = FALSE;PortManager::PortManager(){ m_ports = NULL; m_pnums = 0; m_ppstart = 0; m_ppend = 0;}PortManager::~PortManager(){ if(m_ports) delete [] m_ports;}/* * 函数介绍:初始化port数组。每一位代表一对ports * 输入参数:无 * 输出参数:无 * 返回值 :0 - 成功 * */Int32 PortManager::Initialize(){ //从配置中读取port的范围// int ret = XMLConfig::GetPortRange(m_ppstart,m_ppend);// Assert(ret); m_ppstart = SConfigPara::m_StartPortNum; m_ppend = SConfigPara::m_EndPortNum; m_ppstart=(m_ppstart%2==0)?m_ppstart:m_ppstart-1; m_ppend=(m_ppend%2==0)?m_ppend:m_ppend-1; //计算port数,开始和结束都时偶数,奇数则舍去,没一位表示一对ports m_pnums=(m_ppend-m_ppstart)/2/(sizeof(UInt32)*8)+1; m_ports=new UInt32 [m_pnums]; Assert(m_ports!=NULL); if(!m_ports) { ERR_LOGGER(LOG_RUN_LEVEL_HIGH,LOG_MODULE_OS,-1,"Allocate Port arrary failed"); return OS_Err; } //port map. 1: 未使用, 0:已使用 memset((void *)m_ports,0xff,sizeof(UInt32)*m_pnums); return OS_NoErr;}/* * 函数介绍:释放port数组。 * 输入参数:无 * 输出参数:无 * 返回值 :无 */void PortManager::Uninitialize(){ if(m_ports) delete [] m_ports; m_ports=NULL;}/* * 函数介绍:取得一对port, * 输入参数:无 * 输出参数:无 * 返回值 :0 - 失败 * >0 - 返回的时一对port的起始port,起始port一定是偶数 */ UInt16 PortManager::GetPairPort(){ UInt16 port=0; if(!m_ports) return port; for(int i=0;i<m_pnums;i++) { //找到有空闲port的字节 if(m_ports[i]) { //试图找到其中的空闲位 UInt32 map=0x1; for(int j=0;j<(int)(sizeof(UInt32)*8);j++) { map=0x1<<j; if(m_ports[i] & map) {//找到空闲的位 //由该位计算对应的port port= (i*sizeof(UInt32)*8 +j)*2 + m_ppstart; //清除该位,即该位已在使用 m_ports[i] &= ~map; break; } } } if(port!=0) break; } if(port == 0) ERR_LOGGER(LOG_RUN_LEVEL_LOW,LOG_MODULE_OS,-1,"FULL! PortManager can not allocate new pair port"); if(bDebug) PrintMap(); return port;}/* * 函数介绍:回收一对port * 输入参数:v_p - 起始port * 输出参数:无 * 返回值 :无 */void PortManager::FreePairPort(UInt16 v_p){ //确认该port是否合法 if(v_p>=m_ppstart && v_p <=m_ppend && m_ports && v_p%2==0 ) { UInt32 map=0x1; //计算port在map中的哪个字节 UInt16 index= (v_p-m_ppstart)/2/(sizeof(UInt32)*8); //计算port在字节的哪个位 UInt8 bit= (v_p-m_ppstart)/2%(sizeof(UInt32)*8); //置位该位 map<<=bit; m_ports[index] |=map; } if(bDebug) PrintMap();}/* * 函数介绍:取得全局唯一实例,并初始化 * 输入参数:无 * 输出参数:无 * 返回值 :无 */PortManager * PortManager::GetInstance(){ if(!m_inst) { m_inst=new PortManager(); Assert(NULL != m_inst); } return m_inst;}/* * 函数介绍:销毁全局唯一实例 * 输入参数:无 * 输出参数:无 * 返回值 :无 */Bool PortManager::DelInstance(){ if(m_inst) { m_inst->Uninitialize(); delete m_inst; m_inst=NULL; } return TRUE;}void PortManager::PrintMap(){ for(int i=0;i<m_pnums;i++) { printf("%05d=[%x]\t",i,m_ports[i]); if((i+1) % 4 == 0) printf("\n"); } printf("\n");}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -