博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
GS给客户单发包以及m_queGcWait(所有GC共享)
阅读量:4358 次
发布时间:2019-06-07

本文共 1775 字,大约阅读时间需要 5 分钟。

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(-1 == 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;}

 

转载于:https://www.cnblogs.com/zzyoucan/p/4147582.html

你可能感兴趣的文章
day16 Python 类的关联关系
查看>>
request.getParameter() 和request.getAttribute() 区别
查看>>
本地win8系统部署网站遇到的问题
查看>>
MySQL安装,启动
查看>>
JAVA基础知识总结
查看>>
UVA 101 - The Blocks Problem(模拟)
查看>>
《番茄工作法图解》第二章阅读笔记
查看>>
Java提升代码性能整理
查看>>
[洛谷P1017] 进制转换
查看>>
luogu 2257 YY的GCD
查看>>
看图写话
查看>>
Java接口自动化测试TestNG
查看>>
Nginx源码研究一:NGINX模块启动
查看>>
C#一般处理程序中使用Session
查看>>
dojo 学习日记 之 数组操作
查看>>
Linux基础初识(七)
查看>>
Android完全关闭应用程序
查看>>
页面加载时加Loading效果
查看>>
113.Path Sum II(append 和+的区别)
查看>>
字符串的操作String
查看>>