GS给客户单发包以及m_queGcWait(所有GC共享)
send_stat BaseChannel::SendCmd(int nCmd, void* pData, int nLen)
{
Protocol Ptl;
Ptl.cmd_type = nCmd;
Ptl.content = pData;
Ptl.size = nLen;
void* tmpBuffer = ms_pSendBuff2C; if (nLen > __GC_MAX_SEND_BUFF_LEN)
{
ShuiHu::GetLogger()->Fatal( "【%s(%d行)】严重错误,发送cmd=%d包,包长度(%d)比最大发送包(%d)更大 ",
__FUNCTION__, __LINE__, nCmd, nLen, __GC_MAX_SEND_BUFF_LEN);
safe::error_msg("GC发送包长度过长!");
} int nSize = Ptl.to_buffer(tmpBuffer, __GC_MAX_SEND_BUFF_LEN);//打包到tmpBuffer
if(- == nSize)
return send_stat::send_parameter_error; DataPkt Pkt;
//此处用内存池有个问题,加入共享内存一直pop不出来,这个内存迟早会用完,有个缓冲队列好好处是没发送出去你可以返回去干其他的事情,等下次去发送
//所以此处需要重新分配内存去保存包内容,内存池的好处就是重复的new,delete
//我看了下他这个pop如果用完了他是重新new的,这还差不多,不然要等待扯犊子了
Pkt.pData = m_pShare->PopPkt(nSize);//GC共享内存池中分配一块内存
Pkt.nSize = nSize;
memcpy(Pkt.pData, tmpBuffer, nSize); m_queCmd.push(Pkt);//发到命令缓冲中 return SendCmdTry();
} send_stat BaseChannel::SendCmdTry()//只能这样说每个GC每发送一个包,他都企图把它所有剩余的包发送出去
{
if (!m_queCmd.size())
return send_stat::send_succeed; for(;;)
{
if (m_queCmd.empty())
break;
DataPkt pkt = m_queCmd.front(); {
send_stat hr = m_pDataLayer->SendData(m_nChannelId, pkt.pData, pkt.nSize);//发给网络层
if(hr != send_stat::send_succeed)//没发送成功,说明发送端的共享内存用完了(有个疑问为什么不把共享内存弄大一点)
{
//放入等待队列,让GS来发送(有个问题为什么要让GS发送,发送失败直接返回,下次再发送就是了)
m_pShare->PushGcWait(m_nChannelId);//将其放到未发送的所有GC共享队列中去
return hr;
}
} m_queCmd.pop();//说明发送成功 m_pShare->PushPkt(pkt.pData, pkt.nSize);//归还共享内存
}
return send_stat::send_succeed;
}

GS给客户单发包以及m_queGcWait(所有GC共享)的更多相关文章

  1. Git客户单for Windows

    1.GItHub for Windows  可参考:http://www.ihref.com/read-16514.html

  2. NGINX转发代理情况下,获取客户单真实IP

    编译时加上http_realip_module 模块 realip模块生效的前提是:直接连接nginx的ip是在set_real_ip_from中指定的. 原机配置: set_real_ip_from ...

  3. node基础学习——http基础知识-01-客户单请求

    <一> HTTP基础createServer()相关事件介绍 1. 创建HTTP服务器 server = http.createServer([requestListener]) // 下 ...

  4. 002-创建型-03-单例模式(Singleton)【7种】、spring单例及原理

    一.概述 保证一个类仅有一个实例,并提供一个全局访问点 私有构造器.线程安全.延迟加载.序列化和反序列化安全.反射攻击 1.1.适用场景 1.在多个线程之间,比如servlet环境,共享同一个资源或者 ...

  5. Spring工作原理与单例

    最近看到spring管理的bean为单例的,当它与web容器整合的时候始终搞不太清除,就网上搜索写资料, Tomcat与多线程, servlet是多线程执行的,多线程是容器提供的能力. servlet ...

  6. Spring对象类型——单例和多例

    由于看淘淘商城的项目,涉及到了项目中处理spring中bean对象的两种类型,分别是单例和多例,就在此记录一下,方便加深理解,写出更加健壮的代码. 一.单例和多例的概述 在Spring中,bean可以 ...

  7. JVM系列.JDK演进历史

    Java程序员为什么要了解虚拟机相关的知识 Java程序在设计之初就号称"一次编译,到处运行".Java之所以能做到"一次编译,处处运行"是因为Java虚拟机隐 ...

  8. 13_Python的面向对象编程-类class,对象object,实例instance

    1.面向对象概述 1.类是用来描述对象的工具,把拥有相同属性和行为的对象分为一组     2.对象是由类实例化出来的一个具体的对象         属性: 对象拥有的名词,用变量表示         ...

  9. 玩转直播系列之RTMP协议和源码解析(2)

    一.背景 实时消息传输协议(Real-Time Messaging Protocol)是目前直播的主要协议,是Adobe公司为Flash播放器和服务器之间提供音视频数据传输服务而设计的应用层私有协议. ...

随机推荐

  1. CS Academy Round #65 Count Arrays (DP)

    题目链接  Count Arrays 题意  给定$n$和$m$个区间.若一个长度为$n$的$01$序列满足对于每一个给定的区间中至少有一个位置是$0$, 那么这个$01$序列满足条件.求有多少满足条 ...

  2. Java NIO.2 Files类的常用方法

    Files类是一个工具类,提供了大量的静态方法来操作文件.文件夹. Files类常用方法: long size(Path  path)    //返回文件大小 boolean  isDirectory ...

  3. MAC(Linux)升级Openssl

    系统上一般默认安装的是0.9.8版本的Openssl,不能满足需要.这时候就要重新安装Openssl. 上官网下载新版openssl:https://www.openssl.org/source/ 解 ...

  4. Jenkins强制设置语言为中文

    解决方法如下: 1.使用中文版的google浏览器,并确定把语言设置成了中文.语言配置在设置页.如下: 2.直接设置jenkins的语言.强制性. 前提:先安装插件:Locale plugin 配置如 ...

  5. log4j 2使用properties文件进行配置

    网上不少文章给的都是用xml进行配置,也会提到无法使用properties文件对log4j进行配置,但那应该只是在他们写文章的时候才是如此,最新的2.8.2版本经过我试验后是可以做到的当然该文件最好放 ...

  6. ios大文件存储

    I am using Erica Sadun's method of Asynchronous Downloads (link here for the project file: download) ...

  7. django网站搭建常用的一些代码

    from functools import wrapsdef check_user_login(func): @wraps(func) def return_wrapper(request, *arg ...

  8. JAVA Eclipse 出现 load id=gralloc != hmi-id=gralloc怎么办

    一般是应用程序权限导致的,在Manifest.xml文件中,targetSdkVersion设置不正确,你可以直接删掉这个信息                              

  9. 移动端弹窗 layer.js 使用

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. 【React Native开发】React Native控件之DrawerLayoutAndroid抽屉导航切换组件解说(13)

    ),请不要反复加群! 欢迎各位大牛,React Native技术爱好者增加交流!同一时候博客左側欢迎微信扫描关注订阅号,移动技术干货,精彩文章技术推送! 该DrawerLayoutAndroid组件封 ...