⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 portmanager.cpp

📁 跨操作系统的微型中间件
💻 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 + -