zoukankan      html  css  js  c++  java
  • GS给客户单发包以及m_queGcWait(所有GC共享)

    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;
    }
  • 相关阅读:
    jquery.validate.unobtrusive的使用
    企业库判断数据库连接类型
    win10下安装LoadRunner12汉化包
    win10安装LoadRunner时,安装.net framwork组件报0x800F081F错误 解决办法
    wrk性能测试(详解)
    wrk压测报错 LF character expected at 1:111
    Linux scp命令详解(服务器之间复制文件或目录)
    Linux cat命令详解(连接文件并打印到标准输出设备上)
    性能测试流程
    ‘mysql’不是内部或外部命令,也不是可运行的程序--解决方法
  • 原文地址:https://www.cnblogs.com/zzyoucan/p/4147582.html
Copyright © 2011-2022 走看看