一个包的net到gs流程
再来看看一个包走共享内存的流程
先来看看net进程这块如何处理的
{//用shareData这种类型封装刚才从无锁队列中取到的包
shareData sd;
sd.channel_id = pkt.channel_id;
sd.data = pkt.data;
sd.is_data = pkt.is_data;
sd.size = pkt.size;
auto hr = m_spShareMemInter->pushA(sd);//将这个包放入共享内存中
}
//具体看下是如何放入共享内存的
bool shareMemInterOneway::pushIn(shareData sd)
{
scoped_lock<interprocess_mutex> lock(m_mem镜像->mutex);//需要加进程锁,不同进程访问 shareDataEx sd2;
bool hr = m_ProcessMemPool.getPkt(sd.size, sd2);
if(!hr)
return false; sd2.size = sd.size;
sd2.channel_id = sd.channel_id;
sd2.is_data = sd.is_data;
if(sd.is_data)
{
memcpy(sd2.data, sd.data, sd.size);
} m_ShareMemQue->push_back(sd2);
return true; } bool ProcessMemPoolEx::getPkt(int len, shareDataEx& sd)
{
if(len < )//根据长度判断从哪种共享内存中取
return m_ProcessMemPool0.getPkt(len, sd);
else if(len < )
return m_ProcessMemPool1.getPkt(len, sd); return m_ProcessMemPool2.getPkt(len, sd);
} bool ProcessMemPool::getPkt(int len, shareDataEx& sd)
{
if(len > m_memSize)
{
//测试
wchar_t tips[] = {};
wsprintf(tips, L"Warning100o: len:%d, memSize:%d!", len, m_memSize);
MessageBox(NULL, tips/*L"100o"*/, L"1ooo", MB_OK);
return false;
} if(!m_queue->size())
return false; sd = m_queue->front();//看到这个就应该知道为什么要初始化那个共享的队列
m_queue->pop_front();
sd.data = convertAdd(sd.index);
return true;
}
void* ProcessMemPool::convertAdd(int index)
{
return (char*)m_start_addr + (index * m_memSize);//正好通过这个index获取共享内存池的相应地址
} 附:m_queue初始化代码:
{
for (int i = ; i < m_buffer_num; i++)
{
shareDataEx sd;
sd.index = i;//正是用这个index代表了内存池的哪一块
sd.size = ;
sd.total_size = m_memSize;
m_queue->push_back(sd);
}
} bool shareMemInterOneway::pushIn(shareData sd)
{
scoped_lock<interprocess_mutex> lock(m_mem镜像->mutex); shareDataEx sd2;
bool hr = m_ProcessMemPool.getPkt(sd.size, sd2);//在调用Getpkt之后就会获得一块内存的地址
if(!hr)
return false; sd2.size = sd.size;
sd2.channel_id = sd.channel_id;
sd2.is_data = sd.is_data;
if(sd.is_data)
{
memcpy(sd2.data, sd.data, sd.size);//然后就将传递进来的sd内存复制到共享内存中的内存池,而sd中的这个内存就是那个m_recvBuff里面的,有个问题就是这个m_recvBuff为什么要分配100m的内存,需要这么大么?
} m_ShareMemQue->push_back(sd2);//然后他将这个sd2放到放到交互的共享队列中,注意这里面的内存还是分配在共享内存池中的,m_ShareMemQue中只是保存了一个地址而已
return true; }//这样一个包就放入共享的队列中了
一个包的net到gs流程的更多相关文章
- 一个包的libevent流程
//一个发包的流程 第一个包就是客户端的心跳包,现在加了版本的包 再来看看这个发包打包过程,过程坚持,但理解费劲 void NGP::OnliveTimer()//客户端心跳,5s发一次 { Send ...
- python基础之打/解包及运算符与控制流程
python基础之打/解包及运算符与控制流程 python中的解压缩(即序列类型的打包和解包) python提供了两个设计元祖和其他序列类型的处理的便利,也就是自动打包与自动解包功能,比如: data ...
- 判断一个Activity 判断一个包 是否存在于系统中 的方法
判断一个包是否存在于系统中(来自网络),经过测试,好用: public boolean checkBrowser(String packageName) { if (packageName == nu ...
- python高级编程 编写一个包1
#目的是:编写,发行python包可重复过程"""1:是缩短开始真正工作之前所需要的设置时间,也就是提供模板2:提供编写包的标准化方法3:简化测试驱动开发方法的使用4:为 ...
- Android系统,动态找出一个包下所有的类
最近在写一个android应用,由于针对不同机型功能很不同,为了隔离变化,希望将各项功能插件化,通过编译开关来控制不同版本的功能,而不是在代码中通过逻辑来判断. 我想了一个办法,用表驱动的方法,结合插 ...
- SSIS从理论到实战,再到应用(1)----创建自己的第一个包
原文:SSIS从理论到实战,再到应用(1)----创建自己的第一个包 其实,如果你使用sql2008的导出导入工具的时候,你就已经在使用包了. 目标:使用sql2008 导入导出工具,导入excel数 ...
- npm 是node.js下带的一个包管理工具
npm 是node.js下带的一个包管理工具 npm install -g webpack webpack是一个打包工具 gulp是一个基于流的构建工具,相对其他构件工具来说,更简洁 ...
- debian系统的另一个包管理器aptitude
最近在玩OPI的时候遇到了一个包因为各种依赖问题死活装不上.苦搜很久找到这个aptitude包管理器. 基于debain衍生的各种操作系统比较常用包管理器是apt,不过apt在遇到依赖问题的时候处理得 ...
- Android--------从一个包中的Avtivity创建另外另外一个包的Context
Android中有Context的概念,想必大家都知道.Context可以做很多事情,打开activity.发送广播.打开本包下文件夹和数据库.获取classLoader.获取资源等等.如果我们得到了 ...
随机推荐
- 这次一定理清晰ThinkPHP之中的模型、数据库之间命名规范
ServiceSiteModel.class.php 这个模型操控的数据库是service_site表: <?php namespace Admin\Model; use Think\Model ...
- C++读入两个参数
题目内容:编写程序计算两个整数的差. 输入描述:输入数据含有不超过50个整数对,每个整数队及每对整数的运算结果都不会超过231或-231. 输出描述:对于每次读入的一对整数,输出前者减去后者的差.每个 ...
- BAT命令介绍【转自Internet】
一.简单批处理内部命令简介 1.Echo 命令 打开回显或关闭请求回显功能,或显示消息.如果没有任何参数,echo 命令将显示当前回显设置. 语法: echo [{on│off}] [message] ...
- SymPy库常用函数
简介 SymPy是一个符号计算的Python库.它的目标是成为一个全功能的计算机代数系统,同时保持代码简 洁.易于理解和扩展.它完全由Python写成,不依赖于外部库.SymPy支持符号计算.高精度计 ...
- linux内核SPI总线驱动分析(二)(转)
简而言之,SPI驱动的编写分为: 1.spi_device就构建并注册 在板文件中添加spi_board_info,并在板文件的init函数中调用spi_register_board_info(s3 ...
- 9.python的布尔类型与流程控制
布尔类型其实可以算是一种特殊的数字,下面是 help() 函数得到的帮助信息: Help on class bool in module __builtin__: class bool(int) | ...
- ruby 笔记
symbol 不能有- 'data-turbolinks-track' => true stop rails –s kill -INT $(cat tmp/pids/server.pid) cl ...
- ruby on rails 实战(一)
通过ruby on rails 一步一步搭建个人站点,涉及到的技术有:ruby,rails,javascript,jquery 操作系统:win7 IDE: rubymine 5.4. 第一步,下载安 ...
- 刀哥多线程现操作gcd-10-delay
延迟操作 // MARK: - 延迟执行 - (void)delay { /** 从现在开始,经过多少纳秒,由"队列"调度异步执行 block 中的代码 参数 1. when 从现 ...
- Datastage数据装载报错:Consumed more than 1000000 bytes looking for record delimiter
使用Datastage装载数据时报错如下图: 使用ds进行数据传输时,出现上述问题,最终找到了问题的原因: 我所使用的数据文件比较大,上传到服务器的时候传了80%就出现服务器存储空间不够,我删除以前的 ...