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;
}

最新文章

  1. C语言 · 最小公倍数
  2. 《BI那点儿事》Microsoft 线性回归算法
  3. 网站中集成jquery.imgareaselect实现图片的本地预览和选择截取
  4. 《深入理解Nginx》阅读与实践(三):使用upstream和subrequest访问第三方服务
  5. hunnu 小明的烦恼——找字符串
  6. [LeetCode] 205. Isomorphic Strings 解题思路 - Java
  7. VMware vCenter Converter 使用,Error code: 2147549183 (0x8000FFFF) 解决方案
  8. TML5安全:CORS(跨域资源共享)简介
  9. Nginx平滑升级源码分析
  10. Android 实现高仿iOS桌面效果之可拖动的GridView(上)
  11. 2018-09-15 Java源码英翻中库以及服务原型
  12. ARP欺骗攻击
  13. 高性能场景下,HashMap的优化使用建议
  14. oracle查看被锁的表和解锁
  15. 数学——函数极限知识以及sympy库的limit
  16. hdu1176--免费馅饼(简单动态规划)
  17. wps相关问题
  18. Java Singleton(单例模式) 实现详解
  19. Chapter5 (语句) --C++Prime笔记
  20. C++开学第一次作业(5.4)

热门文章

  1. javascript 获取焦点和失去焦点事件
  2. AC日记——[ZJOI2008]树的统计Count bzoj 1036
  3. TensorFlow——Checkpoint为模型添加检查点
  4. [USACO15JAN]踩踏Stampede
  5. Decrease (Judge ver.)
  6. 利用Jdk 6260652 Bug解析Arrays.asList
  7. 用NSLogger代替NSLog输出调试信息
  8. CSS 属性选择器的深入挖掘
  9. Linux USB驱动数据结构
  10. git 服务器搭建,在自己服务器上搭建私有仓库