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; }
时间: 2024-10-07 07:24:06